对蓝桥杯 算法练习 003 K好数 的理解

78 篇文章 4 订阅
67 篇文章 1 订阅

ALG_003_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
分析:
1.L位:是指数的长度是L位
2.K进制:进制为K(最大的那个数字是K-1)
3.由0~k-1中的数字组成的数
4.相邻位数不连续则满足条件
5.统计总个数对1000000007取模后输出

数据规模与约定:
		对于30%的数据,K^L <= 10^6;
		对于50%的数据,K <= 16, L <= 10;
		对于100%的数据,1 <= K,L <= 100。
/**
		@author Mingxu_Deng
		@version 2020-10-4下午03:52:40

问题:
		如果一个自然数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
	分析:
		1.L位:是指数的长度是L位
		2.K进制:进制为K(最大的那个数字是K-1)
		3.由0~k-1中的数字组成的数
		4.相邻位数不连续则满足条件
		5.统计总个数对1000000007取模后输出
		
	数据规模与约定:
			对于30%的数据,K^L <= 10^6;
			对于50%的数据,K <= 16, L <= 10;
			对于100%的数据,1 <= K,L <= 100。
 */
public class ALG_003_KGoodNumber {
	public static void main(String[] args) {
		int K,L,i,j,a,count=0;
		Scanner s = new Scanner(System.in);
		K = s.nextInt();L = s.nextInt();
		//创建 L 位 K 进制的二维数组
		int[][] arr = new int[L+1][K];
		for(i = 0;i<K;i++){//因为每个 0~K 之间的数在第一个位置上都只有一种可能,故在第一行的每个位置赋值为1
			arr[1][i] = 1;
			}
		for(i = 2;i<=L;i++){// for 循环,从第二行开始,直到 L 行结束(包括第L行)
			for(j=0;j<K;j++){// for 循环,每个位置上的数都只能是 0~K 之间的数
				for(a=0;a<K;a++){//同时在 0~K 之间对数组遍历,进行筛选
					if(a!=j-1 && a!=j+1){//如果满足 K 好数的条件
						//则把二维数组中最后一行的值改为每一列可能性的总值
						arr[i][j] += arr[i-1][a];
						//取模存放,避免占用内存过大
						arr[i][j] %= 1000000007;
						}
					}
				}
			}
		//对数组中的每一列的结果总值进行汇总(同时用1000000007取模,以保证输出结果的正确性)
		for(i=1;i<K;i++){
			count += arr[L][i];
			count %= 1000000007;
			}
		System.out.println(count);
		}
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值