124 周赛
第三题
py
M=10**9+7
R=10**3
F=[1]*(R+1)
for i in range(2,R+1):
F[i]=(F[i-1]*i)%M
Fhyp=[1]*(R+1)
Fhyp[R]=pow(F[R],M-2,M)
for i in range(R-1,-1,-1):
Fhyp[i]=(Fhyp[i+1]*(i+1))%M
def C(n,k):
if n<0 or k<0 or n<k:
return 0
return (F[n]*Fhyp[n-k]*Fhyp[k])%M
# 返回值 res,表示数字 x 经过 res 轮转换后,变为 1
def g(x):
if x==1:
return 0
return 1+g(bin(x).count('1'))
# 二进制:从右到左计算
n=[int(e) for e in input()[::-1]]
k=int(input())
if k==0:
print(1)
elif k == 1:
print(len(n) - 1)
else:
# 先计算 n 上哪些位是 1
nSetIndex = [i for i in range(len(n)) if n[i] == 1]
# n 身上 1 的数量
nSetNum = len(nSetIndex)
# 所以这里只判断 k-1,原因是,只要一个数字 n 的二进制上有 j 个 1,那么这个数字就是易变数。
J=[j for j in range(1,1000) if g(j)==k-1]
s = 1 if g(nSetNum) == k-1 else 0
for i in range(nSetNum):
bitsLen = nSetIndex[i]
for j in J:
# 求:从 bitsLen 位中,设置 j - (nSetNum - 1 - i) 位为 1 的可能的结果数量
s += C(bitsLen, j - (nSetNum - 1 - i))
print(s % M)