度的数量
这一题主要是题意比较搞人,第一个break不太好理解
def dp(x):
if x==0:
return 0
nums=[]
while x>0:
nums.append(x%b)
x//=b
ans=0
last=0
for i in range(len(nums)-1,-1,-1):
x=nums[i]
if x!=0:
ans+=f[i][k-last]
if x>1:
if k-last>0:
ans+=f[i][k-last-1]
break
elif x==1:
last+=1
if last>k:
break
if i==0 and last==k:
ans+=1
return ans
N=35
def init():
for i in range(N):
for j in range(i+1):
if j==0:
f[i][j]=1
else:
f[i][j]=f[i-1][j]+f[i-1][j-1]
return
n,m=map(int,input().split())
k=int(input())
b=int(input())
f=[[0 for i in range(N)]for j in range(N)]
init()
print(dp(m)-dp(n-1))
数字游戏
首先得预处理一个dp数组
其次就是数位dp的一个过程
- 枚举当前点选择该数字还是不选择该数字
- 如果不选择该数字,那么就可以通过预处理的数字直接求得答案
- 如果选择当前数字,则往下走,如果不满足条件了,直接break
def init():
for i in range(10):
dp[1][i] = 1
for i in range(2,5):
for j in range(10):
for k in range(j,10):
dp[i][j]+=dp[i-1][k]
return
def dfs(x):
if x==0:
return 0
nums=[]
while x!=0:
nums.append(x%10)
x//=10
last=0
ans=0
for i in range(len(nums)-1,-1,-1):
x=nums[i]
for k in range(last,x):
ans+=dp[i+1][k]
if x<last:
break
else:
last=x
if i==0:
ans+=1
return ans
dp=[[0 for i in range(11)]for j in range(5)]
init()
for i in range(2):
l,r=map(int,input().split())
print(dfs(r)-dfs(l-1))