K好数
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
样例分析(解题思路):
-
1位4好数就是这个数本身了:1,2,3
-
2位4进制数有10,11,12,13,20,21,22,23,30,31,32,33,符合4好数的数有11,13,20,22,30,31,33 共7个
-
那3位4进制4好数就有111,113,130,131,133,200,202,203,220,222,300,302,303,311,313,330,331,333 共18个
-
从下面的分析我们可以看出2位4好数可以由1位4好数的结果推出,3位4好数可以由2位4好数的结果推出,那么4位4好数的结果也可以由3位4好数的结果推出
任意两位数都不是相邻的数 1位4好数 --> 2位4好数 1 --> 11、13 2 --> 20、22 3 --> 30、31、33 2位4好数 --> 3位4好数 11--> 111、113 13 --> 130、131、133 20 --> 200、202、203 22 --> 220、222 30 --> 300、302、303 31 --> 311、313 33 --> 330、331、333
-
所以这题用动态规划算法来解决
-
L位数时,那我们只要确定第一位数,第二位数不与第一位数相邻,第三位数不与第二位数相邻……用array[i] [j] = array[i] [j] + array[i-1] [k] 来做。
-
代码实现
import java.util.Scanner;
public class KGoodNumbers {
final static int M = 1000000007;
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int sum = 0;
int K = scanner.nextInt(); //输入K,表示K进制
int L = scanner.nextInt(); //输入L,表示L位K进制
int array[][] = new int[L+1][K];
for (int i = 1; i <= L ; i++) {
for (int j = 0; j < K; j++) {
array[i][j] = 0;
}
}
for (int i = 0; i < K; i++) {
array[1][i] = 1;
}
for (int i = 2; i <= L; i++) {
for (int j = 0; j < K; j++) {
for (int x = 0; x < K; x++) {
if (x != j-1 && x != j+1){
array[i][j] += array[i-1][x];
array[i][j] %= M;
}
}
}
}
for (int i = 1; i < K ; i++) {
sum += array[L][i];
sum %= M;
}
System.out.println(sum);
}
}
运行结果