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