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);
    }


}

运行结果

请添加图片描述

posted @ 2021-07-26 14:13  小芦荟同学  阅读(532)  评论(0编辑  收藏  举报