解题思路:找到规律即可
注意事项:主要要注意分段后可能剩下的不能组成k位的数值取值情况
参考代码:
import math
k,w=map(int,input().split())
a=math.ceil(w/k)#ceil函数向上取整,求可以分段的个数
b=w%k#求余数,即每k个分为一段后剩下的个数,例如输入3 7后,二进制形式如* *** ***
c=0
for i in range(1,a):#循环的次数等于位数的种数,例如题目例子里面位数可以为2或者3
if i==a-1:#如果开始考虑取最大位数时的情况,例如题目中取3位数时
for m in range(1,2**b):#循环次数等于最高位取值的个数,题中最高位只有取1一种情况,取值个数=2**位数-1,range中反正也只能取到之前一位不要减一了
for n in range(1,2**k-m-i+1):#到达这一步说明下面的j循环已经结束了,所以从j循环结束时的值开始考虑,即2**k-i开始,然后随着最高位增加而减小
c+=n
else:
for j in range(1,2**k-i):#循环都是从1开始,随着位数增加逐一减小,例如从6+5+4...+1到5+4...+1
c+=j
print(c)
0.0分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复