逆元法求組合數

2021-10-02 10:58:17 字數 1397 閱讀 9990

(a+b)%p = a%p + b%p ;

(a-b)%p = a%p - b%p ;

(a*b)%p = a%p * b%p ;

但是(a

b\frac

ba​)%p ≠ amo

dpbm

od

p\frac

bmodpa

modp

​這種時候就要用到逆元

在求組合數時 c(nm

)\tbinom

(mn​

) = n!m

!∗(n

−m)!

\frac

m!∗(n−

m)!n

!​%p ≠ n!m

odpm

!∗(n

−m)!

modp

\frac

m!∗(n−

m)!m

odpn

!mod

p​, 求逆元的時候用到費小馬定律

費小馬定律

若a 與 p互質且p為質數時 ,a(p-1)%p== 1%p ;

因為ap-1 = ap-2 * a , 所以ap-2 為a 的逆元 ,即(x

a\frac

ax​)%p=(x%p)*(ap-2%p)%p ;

求c( nm

)\tbinom

(mn​)%p

求出所有小於n的階乘用f[i] 表示(f[i]%p)

求m! 的逆元即f[m] 的逆元 a = fastpow(f[m],p-2) (快速冪取模)

求(n-m)! 的逆元 b = fastpow(f[n-m],p-2)

c( nm

)\tbinom

(mn​

)%p = f[n] * a * b ;

模板:

#include

using namespace std ;

typedef

long

long ll ;

const

int n=

1e5+5;

const

int mod =

998244353

;int f[n]

; ll n , k , p ;

ll fastpow

(ll a , ll b)

return res ;

}int

main()

cout << ans << endl ;

return0;

}

參考及詳細解說—> 逆元求組合數

還有乙個其他方法求組合數的 —> 求組合數的各種方法

盧卡斯 Lucas 定理 逆元 求組合數

參考文章 lucas定理是用來求 c n,m mod p,p為素數的值。lucas定理 我們令n sp q m tp r.q r p 那麼 在程式設計時你只要繼續對 呼叫lucas定理即可。可以遞迴的去完成這個過程,其中遞迴終點為t 0 時間o logp n p ll lucas ll a,ll b...

乘法逆元 組合數

要求 a b mod p的值,但 a 很大,無法直接求得a b的值時,就要用到乘法逆元。b x 1 mod p x的最小正整數解k叫做b關於模p的乘法逆元。a b mod p a k mod p 證明 k n p 1 b a k mod p a n p 1 b mod p a b n p 1 mod...

組合數學 求組合數

對於求組合數,要根據所給資料範圍來選擇合適的演算法 這道題中所給的資料範圍適合用打表的方法直接暴力求解 先用4e6的複雜度預處理出所有的情況,再用1e4的複雜度完成詢問即可 include using namespace std const int n 2010 const int mod 1e9 ...