【蓝桥杯】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

猜你喜欢

转载自blog.csdn.net/DREAM_yao/article/details/109037081