【蓝桥杯】k-进制数

【蓝桥杯】k-进制数

题目链接: https://www.dotcpp.com/oj/problem1117.html

思路:

有效数字条件:① 有效数字的首位不能为 0 ,② 有效数字中不能有连续的 0 ,③ k 进制的数位上只能是 0~k-1。

  • 首先假设 N = 1,即只有一位数字,它包含的有效的 k 进制总数有 1,2,3,……,k-1,一共是k-1个有效数字,设res1代表这k-1位,res1=k-1,res0代表着不能为0的情况数量为 1 ,res0=1。
  • 然后假设N = 2,当有两位的时候,从右往左数的第二位上可以是 1,2,3,……,k-1,一共是k-1位,从右往左数第一位上可以是 1~k-1 ,也可以是 0 , 所以是和这k-1+1种情况结合,N = 2 时的有效数字为 (k-1) * [ (k-1) +1 ],所以有效数字个数的为 res1= (k-1) * [ (k-1) +1 ],由于首位不能为 0,所以res0=k-1.
  • 当N=3时,从右往左数第三位上可以是 1,2,3,……,k-1,所以res1=(k-1) * { (k-1) * [ (k-1) +1 ] } , 首位不能为0 ,所以res0= (k-1) * [ (k-1) +1 ]

陈述规律:

【N = i 的有效数字数量】 等于 【k-1】 乘【N = i - 1 时:有效数字的数量 +最高位不能为0时的数量】

【N=i 的最高位不能为 0 时的数量】 等于 【N=i-1 时:有效数字的数量】

在这里插入图片描述
在这里插入图片描述

分析图解:
在这里插入图片描述

撸代码:

#include<stdio.h>
int main()
{
	long long n,k;
	scanf("%lld%lld",&n,&k);
	long long res1=k-1,res0=1;
	for(int i=2;i<=n;i++){
		int temp=res1;
		res1=(k-1)*(res1+res0);
		res0=temp;
	}
	printf("%lld\n",res1);
	return 0;
}

题解学习于:https://blog.csdn.net/qq_41923622/article/details/85207046

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值