题目描述:

         一个合法的n位K进制数定义如下: 它是一个首位不为0的K进制数。 它不包含连续的两个0。对于输         入的K,n。求出满足上述条件的K进制数个数。

解题思路:

         这个题应该是一个递推题。可以用f[i]表示i位(最高位是第i位)K进制数的总数,那么就应该有:f[i]=(f[i-1]+f[i-2])*(k-1)。

解释一下:f[i]也就是i位K进制数的总数应该等于:第i-1位为0与第i-1位不为0的情况的和乘以第i位的情况数(1..k-1)

(1)第i-1位为0的情况应该等于i-2位不为0的情况总数,即f[i-2]

(2)第i-1位不为0的情况应该等于f[i-1]

所以f[i]=(f[i-1]+f[i-2])*(k-1)



参考代码:

#include<stdio.h>
int k;
int f(int n)
{
    if(n == 1)
    {
        return k-1;
    }
    else if(n == 2)
    {
        return (k-1)*k;
    }
    else
    {
        return f(n-1)*(k-1) + f(n-2)*(k-1) ;    }
}
int main()
{
    int n;
    scanf("%d%d", &n, &k);
    printf("%d\n",f(n));
    return 0;
}

欢迎留言

点赞(39)
 

0.0分

10 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 13 条评论

斯宾塞 4年前 回复TA
n=3的时候是不是有问题哦
chenxizhan 5年前 回复TA
@chenxizhan 只是说明事实,没有恶意,博主不要生气~
chenxizhan 5年前 回复TA
递推公式 是正确,但证明过程不对。
1. 如果既有“可以用f[i]表示i位(最高位是第i位)K进制数的总数”又有“(2)第i-1位不为0的情况应该等于f[i-1]”,那么f[i]到底代表什么?
2. ”第i-1位为0与第i-1位不为0的情况的和乘以第i位的情况数(1..k-1)“,也完全没道理
按这种错误的思路谁都想不明白。
pingfan443 5年前 回复TA
不喷了 换下一家!
低调 5年前 回复TA
硬是看不懂
qingchunj 5年前 回复TA
这个确实强的没啥话说
mmd 5年前 回复TA
除了6,不知道说什么好了
樱佳 5年前 回复TA
66666666
若無骑士 6年前 回复TA
确实强
滑稽 6年前 回复TA
牛批