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。
解題思路
對于本題使用動態規劃是最簡單的,只要保證相鄰的兩位絕對值不為 1即可,每次高位遍歷一個數據都要進行重新計算是數據規模逐漸龐大,所以必須每次都進行模運算。在二維數組中存儲含義:行為位數,列為此位可以從0到k存的數(這里的k就是進制上限),二維數組儲存的是若最高位(當前最高位)是這個數那么他可以存在多少個k好數
Gcc編譯通過
#include<stdio.h>
#include <math.h>
#define mod 1000000007
#define N 105
int Num[N][N]={0};
long long KGoodNumber(int k,int l)
{
long long cnt=0;
int i,j,x;
for(i=0;i<k;i++){Num[1][i]=1;}
for(i=2;i<=l;i++){
for(j=0;j<k;j++){
for(x=0;x<k;x++){
if(abs(j-x)!=1){
Num[i][j]+=Num[i-1][x];
Num[i][j]%=mod;
}
}
}
}
for(i=1;i<k;i++){//最高位不能為0
cnt+=Num[l][i];
cnt%=mod;
}
printf("%lld",cnt);
}
int main(void)
{
int k,l;
scanf("%d%d",&k,&l);
KGoodNumber(k,l);
return 0;
}
500B
C
正確
100
15ms
824.0KB
總結
- 上一篇: Linux下时钟框架实践---一款芯片的
- 下一篇: Ubuntu20.04 安装AMD显卡驱