原题链接:K-进制数
解题思路:
分析题目后可知:
这个是一个无序插空的问题.
于是分组,将0和其他进制数分为两组,之后对于每个非零位的数字均有K - 1个,对于数字0.
此处假设,是一个N位的一个数字,并且,根据数字分布情况可知,该序列内的0一定不会超过N / 2(向零取整)个.
根据无序插空法可知,该序列中去除第一个必不为0的数后有N - 1个数,其空位(包含头部尾部)有N个,再取其中0有i个.
综上,此时序列内有非零数共N - i个,其每个可以取得的数字根据排列组合则有(K - 1)(N - i)个再根据无序插空公式有Ci(N - i)种0的插入方法故得出以下代码:
注意事项:
直接通过循环来插入0,无0的情况直接可以通过(K - 1)N得出
参考代码:
#include <iostream> #include <cmath> int C(int up,int down){ int T = down - up; int sum = 1; for(int i = 0;i<T;++i) sum *= down--; int T1 = 1; for(;T>0;--T) T1 *= T; return sum / T1; } int main(){ int K,N; std::cin>>N>>K; int sum = pow(K - 1,N); for(int i = 1;i<= N / 2;++i) sum += pow(K - 1,N - i) * C(i,N - i); std::cout<<sum; return 0; }
0.0分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复