题目: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。
思路:
代码:
public class KHaoShu {
final static int Mod=1000000007;
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
int K=sc.nextInt();//输入K进制
int L=sc.nextInt();//输入L长度
int sum=0;
//横坐标是位数,纵坐标是进制
//表示l位以k结尾,从1号开始,k中表示1.2.3.···k-1
int[][] arr=new int[L+1][K];
for(int i=1;i<=L;i++){
for(int j=0;j<K;j++)
arr[i][j]=0;//先进行初始化
}
for(int i=0;i<K;i++){//使得第一行中,只有一位数的k好数为1,以K=4为例,0,1,2,3每个数都是只有1位的k好数
arr[1][i]=1;
}
for(int i=2;i<=L;i++){//每位
for(int j=0;j<K;j++){//每位中k的结尾,这说起来一点都不好理解,自己画图就理解了
for(int x=0;x<K;x++){
if(x!=j-1 && x!=j+1){//就是说不相邻
arr[i][j] += arr[i-1][x];//加上少一位的k的位数的值,先开始的初始值都为0;
arr[i][j] %=Mod;//进行余数计算
}
}
}
}
//把K=0的去掉,不加入sum的值
for(int j=1;j<K;j++){
sum +=arr[L][j];
sum%=Mod;
}
System.out.println(sum);
}
}