leetcode上的1223題:投擲乙個骰子n次,並給出乙個長度為6的陣列,數值不超過15,分別表示1,2,3,4,5,6不能連續出現的次數,求投這n次可能出現的滿足要求的序列的種數。用乙個三維陣列a[6
][16]
[n
]a[6][16][n]
a[6][1
6][n
]進行動態規劃就可以解決。但是現在加強一下限制,去掉限制中連續出現的條件,即陣列每個數分別表示1,2,3,4,5,6在序列中能夠出現的最大次數。可以用乙個二維陣列a[6
][n]
a[6][n]
a[6][n
]來進行動歸,a[i
][j]
a[i][j]
a[i][j
]表示投擲j
jj次只出現前i
ii個數的情況數。動歸方程為a[i
][j]
=∑k=
0min
(r[i
],j)
cjka
[i−1
][j−
k]
a[i][j]=\sum_^c_j^ka[i-1][j-k]
a[i][j
]=∑k
=0mi
n(r[
i],j
)cj
ka[
i−1]
[j−k
],其中r[i
]r[i]
r[i]
表示數字i
ii能出現的最大次數。發現遞迴式子中有組合數,只要n稍微大一些,就會出現組合數超過int表示範圍的情況,因此題目要求輸出模109
+7
10^9+7
109+
7的結果。因此這裡就涉及到求組合數的除以乙個質數的餘數的問題,如果是排列數,那很簡單,因為只有乘法,現在麻煩的是組合數裡面有除法,不能使用簡單的同餘公式來求。
我在網上查詢帶除法的同餘問題,發現可以通過求分母的逆元來解決,求逆元的方法具體參考這裡。比如要求a/b
a/ba/
b除以質數c
cc的餘數,由於質數的同餘構成乙個群,我們可以求出b
bb的逆元b′b'
b′,這樣就只需要求a∗b
′a*b'
a∗b′
除以c
cc的餘數了。
乙個組合數的簡單模板
用到了階乘和階乘逆元預處理 線性求逆元 組合數 c n,m 模板 lzh007 2020 6 1 使用注意n的範圍設定和模mod的範圍設定 include include include include include using namespace std typedef long long ll...
編乙個程式求質數的和
編乙個程式求質數的和,例如f 7 2 3 5 7 11 13 17 58。方法1 對於從2開始的遞增整數n進行如下操作 用 2,n 1 中的數依次去除n,如果餘數為0,則說明n不是質數 如果所有餘數都不是0,則說明n是質數,對其進行加和。空間複雜度為o 1 時間複雜度為o n 2 其中n為需要找到的...
乙個算大數組合數的方法
abc185的第三題是一道簡單的求組合數,但是問題在於,其求解上限為199取11,這超出了int的範圍但是在long long 範圍內,因此,解決此題有乙個計算大數組合數的小技巧 組合數計算公式為 n n m m 因此原式可以化為 n m 1 n m 2 n m m m 高中內容,忘記了 計算大數組...