組合數取模就是求 cn
mmod
p cmn
modp
的值,當然根據n,
m,p n,m
,p
的取值範圍不同,採取的方法也不一樣。
p p
比較大就只能乙個乙個算如
ll c_one_by_one(ll n, ll m)
//組合數乙個乙個算
但是不是很大的要預先處理好階乘
數很大需要逆元
typedef
long
long ll;
ll mod;
ll fac[100000 + 5];
ll quick_mod(ll a, ll b)
b >>= 1;
a = a * a % mod;
}return ans;
}ll c_one_by_one(ll n, ll m)//組合數乙個乙個算
return ans;
}ll c(ll n, ll m)
void init()
ll lucas(ll n, ll m)//choose m from n
傳送門:acdreamer
逆元: a÷
bmodp=
a×b−
1mod
p' role="presentation">a÷b
modp=a
×b−1
modpa÷
bmodp=
a×b−
1mod
p求乙個數的逆元: b−
1=po
w(b,
b−2)
b −1
=pow
(b,b
−2
)
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定理介紹
1.當n,m都很小的時候可以利用楊輝三角直接求。c n,m c n 1,m c n 1,m 1 const int maxn 1e5 10 ll fac maxn 階乘打表 void init ll p 此處的p應該小於1e5,這樣lucas定理才適用 ll pow ll a,ll b,ll m a...
組合數取模(楊輝三角 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 ...