如果一個自然數N的K進製表示中任意的相鄰的兩位都不是相鄰的數字,那麼我們就說這個數是K好數。求L位K進制數中K好數的數目。例如K = 4,L = 2的時候,所有K好數爲11、13、20、22、30、31、33 共7個。由於這個數目很大,請你輸出它對1000000007取模後的值。
輸入包含兩個正整數,K和L。
對於30%的數據,KL <= 106;
對於50%的數據,K <= 16, L <= 10;
對於100%的數據,1 <= K,L <= 100。
不用講DP 剛一開始還沒有想到 遞推每增加一位 以多少(K進制內)結尾的情況有多少
最後把他們加在一起就OK了
#include<bits/stdc++.h>
using namespace std;
#define mod 1000000007
int dp[110][110];
int main(void)
{
int k,l,i,j,h;
while(scanf("%d %d",&k,&l)!=EOF)
{
memset(dp,0,sizeof(dp));
if(l==1)
{
printf("0\n");
continue;
}
for(i=0; i<k; i++)
dp[1][i]=1;
dp[1][0]=0;
for(i=2; i<=l; i++) //多少位
for(j=0; j<k; j++)//以j結尾的幾種情況
{
for(h=0; h<k; h++)
if(abs(h-j)!=1)
{
dp[i][j]+=dp[i-1][h];
dp[i][j]%=mod;
}
}
int sum=0;
for(i=0; i<k; i++)
{
sum+=dp[l][i];
sum%=mod;
}
printf("%d\n",sum);
}
}