數學 Lucas定理

2021-06-22 22:25:33 字數 993 閱讀 1514

lucas定理解決的一類問題是c(n,m) % p,其中n和m很大的情況

顯然如果n和m在1e7的範圍內,我們可以很輕鬆的預處理o(p)+o(1) 得到c(n,m) % p

那麼n和m很大的時候就可以靠lucas定理了

lucas定理:c(n,m) % p = c(n%p, m%p) * c(n/p , m/p) % p

這樣就可以把n,m很大的情況化簡成log(min(n,m))個可以o(1)處理的數之積了

證明

思考一下發現lucas定理將n和m化為兩個p進製的數,然後對每一位單獨取組合數相乘

下面的證明就非常清晰了:

實戰:hdu 3037

很直白的題目,求c(n+m,m) % p,直接上lucas定理就可以,注意這裡求逆元有兩種方法,其效率差不多,可以看情況使用

#include #include #include #include #include #include #include #include using namespace std;

const int n = 100000+20;

typedef long long ll;

ll mod;

ll fac[n],invfac[n];

ll fpow(ll n,ll k,ll mod)

return ans;

}int inv(int a)

ll c(ll n,ll m)

ll n,m;

ll lucas(ll n,ll m,ll p)

return ret;

}void solve()

int main()

return 0;

}

stone 組合數學 Lucas定理

傳送門解題思路 第i組的人數必須大於ci,於是我們可以將問題轉化為 n sum m ci 人分到m組中,且保證每一組的人數大於0,然後我們可以使用隔板法求出分的的組數 c m ci 我們可以直接通過基本的組合公式 費馬小定理直接求,也可以通過lucas定理求得 直接求 code includeusi...

LUCAS定理簡述

lucas定理解決的是n,m比較大而p是小於100000質數 簡而言之就是lucas n,m c n p,m p lucas n p,m p p 其中組合數c是用任意一種計算10五次方內取模的組合數計算 比如可以預處理階乘fac i 然後直接c n,m fac n quickpow fac n m ...

數論 lucas定理

網上證明很多,雖然沒看懂。主要解決大組合數取模的情況 費馬小定理求大組合數 a p 1 1 p 兩邊同除a a p 2 1 a p c n,m n m n m 所以c n,m f n qpow f m f n m mod 2 mod 預處理組合數f 先推公式,再lucas p很大的情況 1e9 7 ...