如何求乙個組合數的除以乙個質數的餘數

2021-09-29 01:41:27 字數 1143 閱讀 1581

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

k​a[

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 高中內容,忘記了 計算大數組...