組合數的求法總結

2021-08-14 06:56:13 字數 1052 閱讀 1774

楊輝三角遞推c(

i,j)

=c(i

−1,j

)+c(

i−1,

j−1)

題目詳見noip2016d2t1

code

for(int i=2;i

<=maxn;i++)

for(int j=2;j

c[i]

[j]=(c[i-1]

[j]+c[i-1]

[j-1])%k;

乘法逆元:(a

/b)%

p=a∗

(bp−

2)(p為素數)

如果p為素數,那麼k的逆元就是k(

p−2)

逆元可以利用擴充套件歐幾里德或尤拉函式求得c(

n,m)

=n!/

(m!∗

(n−m

)!)

那麼可以先計算出n!,m!,(n-m)!對p取模的餘數,那麼轉化為a/

b=x 的問題

因為p為素數,所以等價於bx

+py=

a 然後用擴充套件的歐幾里得定理算出 bx

′+py

′=1 的解,x=

x′∗a

就得到了最終的x的值,即c(

m,n)

得值題目詳見雅禮集訓題目

code

ll inv(ll a)

ll c(ll n,ll m)

return up*inv(down)%p;

}

用lucas定理求組合數,適用於模數p較小的情況lu

cas(

n,m,

p)=c

(n%p

,m%p

)∗lu

cas(

n/p,

m/p,

p)

題目詳見洛谷2675

code

void work()  

ll c(ll n,ll m)

組合數的幾種求法

cnm p c n m p cnm p 0 m n 1000 0 leq m leq n leq 1000 0 m n 1000 1 p 1e9 1 leq p leq 1e9 1 p 1e 9,直接求 void com int n,int p 0 m n 1 e18 0 leq m leq n l...

Lucas定理與大組合數的取模的求法總結

首先給出這個lucas定理 a b是非負整數,p是質數。ab寫成p進製 a a n a n 1 a 0 b b n b n 1 b 0 則組合數c a,b 與c a n b n c a n 1 b n 1 c a 0 b 0 modp同餘 即 lucas n,m,p c n p,m p lucas ...

Lucas定理與大組合數的取模的求法總結

首先給出這個lucas定理 a b是非負整數,p是質數。ab寫成p進製 a a n a n 1 a 0 b b n b n 1 b 0 則組合數c a,b 與c a n b n c a n 1 b n 1 c a 0 b 0 modp同餘 即 lucas n,m,p c n p,m p lucas ...