求給定區間 [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...