解题思路:本题目中要求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.0分

1 人评分

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

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

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

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

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

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

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

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

评论列表 共有 0 条评论

暂无评论