1. 程式人生 > >藍橋杯練習題 K好數

藍橋杯練習題 K好數

問題描述

如果一個自然數N的K進製表示中任意的相鄰的兩位都不是相鄰的數字,那麼我們就說這個數是K好數。求L位K進位制數中K好數的數目。例如K = 4,L = 2的時候,所有K好數為11、13、20、22、30、31、33 共7個。由於這個數目很大,請你輸出它對1000000007取模後的值。

輸入格式

輸入包含兩個正整數,K和L。

輸出格式 輸出一個整數,表示答案對1000000007取模後的值。 樣例輸入 4 2 樣例輸出 7 資料規模與約定

對於30%的資料,KL <= 106

對於50%的資料,K <= 16, L <= 10;

對於100%的資料,1 <= K,L <= 100。 

m[i][j]表示結尾數字為i數字長度為j有幾個好數。

#include <iostream>
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int main() {
	int K,L;
	
	long long **m;
	cin>>K>>L;
	m = new long long*[K];
	for(int i = 0; i<K; i++){
		m[i]=new long long[L];
	} 
	
	//long long m[4][3] = {0};
	m[0][0] = 0;
	for(int i = 1; i<K; i++){
		m[i][0] = 1;
	}
	for(int j = 1; j<L;j++){
		for(int i = 0; i<K; i++){
			long long left = 0;//向上計算 
			long long right = 0;//向下計算
			int tend_up = i-2;
			int tend_down = i+2;
			while(tend_up>=0){
				left+=m[tend_up][j-1];
				tend_up--;
			}
			while(tend_down<K){
				right+=m[tend_down][j-1];
				tend_down++;
			}
			m[i][j] = (left+right+ m[i][j-1])%1000000007;
		}
	}
	/*
	for(int i = 0; i<K; i++){
		for(int j =0 ;j<L; j++){
			cout<<m[i][j]<< " ";
		}
		cout<<endl;
	}
	*/
	long long result = 0;
	for(int i = 0; i<K; i++){
		result+=m[i][L-1] ;
	}
	cout<<result%1000000007<<endl;
	return 0;
}