day7.24

题目: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。

思路:

  • 运用动态规划的想法来写这道题;
  • 相关详细讲解:CSDN链接

代码:

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

}
posted @ 2021-07-24 23:10  头秃准备  阅读(33)  评论(0)    收藏  举报