1.當n,m都很小的時候可以利用楊輝三角直接求。
c(n,m)=c(n-1,m)+c(n-1,m-1);
constint maxn = 1e5 + 10
;ll fac[maxn];
//階乘打表
void init(ll p)//
此處的p應該小於1e5,這樣lucas定理才適用
ll pow(ll a, ll b, ll m)
ans %=m;
return
ans;
}ll niyuan(ll x, ll p)
//x關於p的逆元,p為素數
ll c(ll n, ll m, ll p)
//組合數c(n, m) % p
ll lucas(ll n, ll m, ll p)
2、n和m較大,但是p為素數的時候
lucas定理是用來求 c(n,m) mod p,p為素數的值。
c(n,m)%p=c(n/p,m/p)*c(n%p,m%p)%p
也就是lucas(n,m)%p=lucas(n/p,m/p)*c(n%p,m%p)%p
求上式的時候,lucas遞迴出口為m=0時返回1
求c(n%p, m%p)%p的時候,此處寫成c(n, m)%p(p是素數,n和m均小於p)
c(n, m)%p = n! / (m ! * (n - m )!) % p = n! * mod_inverse[m! * (n - m)!, p] % p
由於p是素數,有費馬小定理可知,m! * (n - m)! 關於p的逆元就是m! * (n - m)!的p-2次方。
p較小的時候預處理出1-p內所有階乘%p的值,然後用快速冪求出逆元,就可以求出解。p較大的時候只能逐項求出分母和分子模上p的值,然後通過快速冪求逆元求解。
n!c(n,r) = --------------------r!∗(n−r)!
ll pow(ll a, ll b, ll m)ans %=m;
return
ans;
}ll niyuan(ll x, ll p)
//x關於p的逆元,p為素數
ll c(ll n, ll m, ll p)
//組合數c(n, m) % p
ll lucas(ll n, ll m, ll p)
1.當n,m都很小的時候可以利用楊輝三角直接求。
c(n,m)=c(n-1,m)+c(n-1,m-1);
constint maxn = 1e5 + 10
;ll fac[maxn];
//階乘打表
void init(ll p)//
此處的p應該小於1e5,這樣lucas定理才適用
ll pow(ll a, ll b, ll m)
ans %=m;
return
ans;
}ll niyuan(ll x, ll p)
//x關於p的逆元,p為素數
ll c(ll n, ll m, ll p)
//組合數c(n, m) % p
ll lucas(ll n, ll m, ll p)
2、n和m較大,但是p為素數的時候
lucas定理是用來求 c(n,m) mod p,p為素數的值。
c(n,m)%p=c(n/p,m/p)*c(n%p,m%p)%p
也就是lucas(n,m)%p=lucas(n/p,m/p)*c(n%p,m%p)%p
求上式的時候,lucas遞迴出口為m=0時返回1
求c(n%p, m%p)%p的時候,此處寫成c(n, m)%p(p是素數,n和m均小於p)
c(n, m)%p = n! / (m ! * (n - m )!) % p = n! * mod_inverse[m! * (n - m)!, p] % p
由於p是素數,有費馬小定理可知,m! * (n - m)! 關於p的逆元就是m! * (n - m)!的p-2次方。
p較小的時候預處理出1-p內所有階乘%p的值,然後用快速冪求出逆元,就可以求出解。p較大的時候只能逐項求出分母和分子模上p的值,然後通過快速冪求逆元求解。
n!c(n,r) = --------------------r!∗(n−r)!
ll pow(ll a, ll b, ll m)ans %=m;
return
ans;
}ll niyuan(ll x, ll p)
//x關於p的逆元,p為素數
ll c(ll n, ll m, ll p)
//組合數c(n, m) % p
ll lucas(ll n, ll m, ll p)
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 n p,m p,p 然而如果...
Lucas 組合數取模
組合數取模就是求 cn mmod p cmn modp 的值,當然根據n,m,p n,m p 的取值範圍不同,採取的方法也不一樣。p p 比較大就只能乙個乙個算如 ll c one by one ll n,ll m 組合數乙個乙個算但是不是很大的要預先處理好階乘 數很大需要逆元 typedef lo...
組合數取模(楊輝三角 Lucas定理 模合數)
1 1 m n 1000 和 1 p 10 9 p可以是任何數 這個問題比較簡單,組合數的計算可以靠 楊輝三角 那麼由於和的範圍小,直接兩層迴圈即可。long long c maxn maxn void comb int n,int m,int p 1 m n 10 18 和 2 p 10 5 p ...