Lucas 組合數取模

2021-08-15 06:22:52 字數 921 閱讀 2041

組合數取模就是求 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 ...