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