演算法題 數字DP 度的數量(Python)

2021-10-16 05:21:01 字數 1280 閱讀 1170

求給定區間 [x,y]中滿足下列條件的整數個數:這個數恰好等於 k 個互不相等的 bb 的整數次冪之和。

例如,設 x=15,y=20,k=2,b=2,則有且僅有下列三個數滿足題意:

17=2^4+2^0

18=2^4+2^1

20=2^4+2^2

輸入格式

第一行包含兩個整數 x 和 y,接下來兩行包含整數 k 和 b。

輸出格式

只包含乙個整數,表示滿足條件的數的個數。

資料範圍

1≤x≤y≤2^31−1

1≤k≤20

2≤b≤10

輸入樣例:

15 20

22

輸出樣例:

3
l, r = map(int, input().split())

k = int(input())

b = int(input())

c = [[0] * 32 for _ in range(32)]

for i in range(32):

for j in range(i+1):

if j == i: c[i][j] = 1

else: c[i][j] = c[i-1][j] + c[i-1][j-1]

def dp(n):

if n == 0: return 0

a =

res = 0

last = 0 #

# 將n轉為b進製的數

while n:

n //= b

for i in range(len(a)-1, -1, -1):

x = a[i]

if x:

res += c[i][k-last] # 如果該位為0, 就從剩下的i個中隨便取k-last個1

if x == 1:

last += 1 # 繼續往下迭代

if last == k: # 代表n為 1111***11***** 前面有k個1,這已經是一種方案了,則直接+1, 就可以了,後面無需計算

res += 1

break

else: # 如果x大於1, 則後面可以直接用組合數計算

if k - last >= 1:

res += c[i][k - last - 1] # 取1,後面少乙個可以放1的坑位

break

return res

print(dp(r) - dp(l-1))

數字DP 度的數量

題面 大意 求給定區間 x,y 中滿足下列條件的整數個數 這個數恰好等於 k 個互不相等的 b 的整數次冪之和。dp x 表示從 0 x 滿足題意的數的個數。那麼接下來分情況討論以分解問題 設 x 有 n 位,在這裡我們記最高位對應下標為 n 1 個位是 0 同時記當前已經放了last個 1 那麼當...

Acwing 1081 度的數量 數字dp

題目大意 求給定區間 x,y 中滿足下列條件的整數個數 這個數恰好等於 k 個互不相等的 b 的整數次冪之和。例如,設 x 15,y 20,k 2,b 2,則有且僅有下列三個數滿足題意 17 24 20 18 24 21 20 24 22 輸入格式 第一行包含兩個整數 x 和 y,接下來兩行包含整數...

AcWing1081 度的數量(數字dp)

對於數字dp的題目,我學習的是y總的模板,也就是說把所有數先用拆位後考慮從頭開始考慮,形成乙個樹的形狀 左分支為填0 ai 1的情況,這列情況一般可以通過數學公式一次性求出,之後右分支就填當前數,這樣向下延申,在最後特判右分支的情況,也就是乙個數 對於數字dp,一般儲存兩個量,乙個是個數,乙個是la...