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