算法训练 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。
这道题目可以看成一串数字,每次在其前面添加一个数字,直到达到要求的位数,求相邻数字不相同的数字串可能的个数
(图画的略丑)如图,每行表示数字串的长度,列表示将该数字添加到所有数字串前形成的可能数目
第二行中的颜色表示当前状态是从哪个状态转移过来的
而要求的答案则是绿色区域的和(因为最前的位置不能为0)
当数字只有一位时,所能构成的数目为k-1(不包含
#include<stdio.h>
int main()
{
int k,l;
long long an[105][105]={0};
scanf("%d%d",&k,&l);
if(l==1)
{
printf("%d",k-1);
}
else
{
for(int i=0;i<k;i++)
{
an[1][i]=1;
}
for(int i=2;i<=l;i++)
{
for(int j=0;j<k;j++)
{
for(int m=0;m<k;m++)
{
if((m!=j-1)&&(m!=j+1))
an[i][j]+=an[i-1][m]%1000000007;
}
an[i][j]%1000000007;
}
}
long long sum=0;
for(int i=1;i<k;i++)
{
sum+=an[l][i]%1000000007;
}
printf("%lld",sum%1000000007);
}
return 0;
}