組合數取模介紹 Lucas定理介紹

2022-05-03 14:30:29 字數 2577 閱讀 8695

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)

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);

const

int 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 ...