藍橋杯練習題 K好數
阿新 • • 發佈:2019-01-31
問題描述
如果一個自然數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; }