解题思路:本题目中要求n位的k进制数,0不能在首位,不能在0的后面,因此每个0只能位于非0数字的后面,因此假设有i个0,则这i个0需要在(n-i)个非0数字的后面选择位置,一共有c(n-i,i)中情况,同时,这n-i个非0数字可能有的排列情况为(k-1)^n-i种(每一个都可能是k-1个数字中的任意一个,k进制为每一位都是从0到k-1中的一个数字),因此,在i确定的情况下,总体的情况一共有c(n-i,i)*(k-1)**(n-i)种,最后同时还需考虑i为每一种大小的情况,然后将这些情况数累加起来就是最终结果
注意事项:i最大为n//2(向下取整),一方面因为i不能大于(n-i),另一方面因为算组合数c(n-i,i)时,i超过n的一半时组合数的情况就重复了
参考代码:
n=int(input())
k=int(input())
def xuanze(a,b):
c=1
for i in range(b):
c*=(a-i)
for j in range(1,b+1):
c/=j
return c
count=0
for i in range(n//2+1):
count+=xuanze(n-i,i)*(k-1)**(n-i)
print(int(count))
0.0分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复