问题描述
如果一个自然数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