*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 <= 10^6;
對於50%的數據,K <= 16, L <= 10;
對於100%的數據,1 <= K,L <= 100。
矩陣中,行代表1-L位自然數,列代表由列數數字開頭的情況,如:dp[i][j]則代表i位以j開頭的K好數數目。
首先判斷當前數字x是否爲j的相鄰數字,若不是,則根據當前數字的K好數的數目進行累加。
/*
Name: 藍橋杯:K好數
Copyright: 拔劍四顧心茫然
Author: 拔劍四顧心茫然
Date: 20/03/14 18:50
Description: dev-cpp 5.11
*/
#include<iostream>
using namespace std;
#define mod 1000000007;
int main()
{
long long int dp[120][120];
long long int sum=0;
int i,j,x,K,L;
cin >> K >> L;
for(i=0;i<K;i++)
dp[1][i] = 1;
for(i=2;i<=L;i++)
for(j=0;j<K;j++)
for(x=0;x<K;x++)
if(x!=j-1 && x!=j+1)//判斷是否爲相鄰數字
{
dp[i][j] += dp[i-1][x];//根據上一行的K好數個數累加
dp[i][j] %= mod;
}
for(i=1;i<K;i++)//0不能作爲首位數字
{
sum += dp[L][i];
sum %= mod;
}
cout << sum;
return 0;
}
一定要儘量申請更大空間,減少不必要的麻煩!!!