k好数(动态规划)
問題描述
如果一個自然數(shù)N的K進制表示中任意的相鄰的兩位都不是相鄰的數(shù)字,那么我們就說這個數(shù)是K好數(shù)。求L位K進制數(shù)中K好數(shù)的數(shù)目。例如K = 4,L = 2的時候,所有K好數(shù)為11、13、20、22、30、31、33 共7個。由于這個數(shù)目很大,請你輸出它對1000000007取模后的值。
輸入格式
輸入包含兩個正整數(shù),K和L。
輸出格式
輸出一個整數(shù),表示答案對1000000007取模后的值。
樣例輸入
4 2
樣例輸出
7
數(shù)據(jù)規(guī)模與約定
對于30%的數(shù)據(jù),KL <= 106;
對于50%的數(shù)據(jù),K <= 16, L <= 10;
對于100%的數(shù)據(jù),1 <= K,L <= 100。
解題思路
對于本題使用動態(tài)規(guī)劃是最簡單的,只要保證相鄰的兩位絕對值不為 1即可,每次高位遍歷一個數(shù)據(jù)都要進行重新計算是數(shù)據(jù)規(guī)模逐漸龐大,所以必須每次都進行模運算。在二維數(shù)組中存儲含義:行為位數(shù),列為此位可以從0到k存的數(shù)(這里的k就是進制上限),二維數(shù)組儲存的是若最高位(當(dāng)前最高位)是這個數(shù)那么他可以存在多少個k好數(shù)
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
總結(jié)
- 上一篇: Linux下时钟框架实践---一款芯片的
- 下一篇: Ubuntu20.04 安装AMD显卡驱