如果一個自然數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。
#include<stdio.h>
#include<string.h>
int dp[110][110];
int main()
{
int i, j, k, n, m;
while(scanf("%d %d",&m, &n) != EOF)
{
if(n == 1)
{
printf("%d\n", m-1);
continue;
}
memset(dp, 0, sizeof(dp));
for(i = 1; i < m; ++i)
dp[1][i] = 1;
int ans = 0;
for(i = 2; i <= n; ++i)
{
for(j = 0; j < m; ++j)
{
for(k = 0; k < m; ++k)
if( k != j-1 && k != j+1)
{
dp[i][j] += dp[i-1][k];
if(dp[i][j] > 1000000007)
dp[i][j] %= 1000000007;
}
if(i == n)
{
ans += dp[i][j];
ans %= 1000000007;
}
}
}
printf("%d\n", ans);
}
return 0;
}
思路:用一個DP數組保存長度爲i末位爲j時的情況數,初始化長度爲1時的情況數爲1,當長度大於1時,要處理好首位爲0的情況,所以我們將dp[1][0]設置爲0,即表示當長度爲2時轉移方程dp[2][j] += dp[1][0]*dp[1][j](默認爲1省略)時保證首位爲0的情況不會統計進去。 當長度爲2爲時首位爲0的未統計進去,那麼長度大於2的都不會統計進去。
轉移方程 dp[i][j] += dp[i-1][k]*1 (k!=j-1 && k!=j+1)。