原题链接:K-进制数
解题思路:
回顾一下题目要求,考虑包含N位数字的K-进制数,如果在该N位K-进制数中不包含两个连续的0,则将其定义为一个有效数,统计所有有效N位K-进制数的数量。阅读完题目,或许应该考虑到解题的关键是如何确定其为一个有效数。结合题目的要求,有效数要不包含两个连续的0(当然,0也不能在开头),再结合已经学过的排列组合知识,即要求两个元素互不相邻,所以可以将问题转化为0的优先排列问题(也就是插空法),即先确定N位数字中0的具体位置,再将剩余位数按照K-进制的数字范围,取所有的非0数字即可。
注意事项:
1.在代码中,使用了两个变量 n 、 m 来分别标记 0 、 非0数 的数量情况,这里要注意 m + n 的和要始终等于总位数 N ,另外 0 的数量一定要小于等于 非0数 的数量,否则一定会出现非有效数的情况
2.在优先排列 0 时,要注意是组合问题,且每次当 m 改变时, 0 的可排列位数也在改变
参考代码:
#include<stdio.h> #include<math.h> int B_th(int m, int n, int K); int Fac(int num); int main() { int N, K, sum = 0; scanf("%d %d", &N, &K); int m = N, n = 0; while(n <= m) { sum += B_th(m, n, K); n++; m--; } printf("%d", sum); return 0; } int Fac(int num) { if(num == 0) { return 1; } else { return (num * Fac(num - 1)); } } int B_th(int m, int n, int K) { int sum; sum = Fac(m) / Fac(m - n) / Fac(n) * pow((K - 1), m); return sum; }
0.0分
3 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复