『数学』--数论--组合数+卢卡斯定理+扩展卢卡斯定理
組合數(shù):
在N個數(shù)中選取M個數(shù),問選的方式有幾種?
直接遞歸暴力簡單
盧卡斯定理:
求CmnmodpC_m^n~mod~pCmn??mod?p
設(shè)m=a0p0+a1p1+?+akpkm={a_0}^{p_0}+{a_1}^{p_1}+\cdots+{a_k}^{p_k}m=a0?p0?+a1?p1?+?+ak?pk?
設(shè)n=b0p0+b1p1+?+bkpkn={b_0}^{p_0}+{b_1}^{p_1}+\cdots+{b_k}^{p_k}n=b0?p0?+b1?p1?+?+bk?pk?
則Cmn≡∏Caibi(modp)C_m^n\equiv\prod{C_{a_i}^{b_i}}(mod~p)Cmn?≡∏Cai?bi??(mod?p)
證明我就不打了,百度百科上有,數(shù)學符號太多了~ _ ~
前置知識:
1.歐幾里得或者費馬小定理求逆元
2.快速冪
實現(xiàn)代碼:
為了快,放了一個數(shù)組,限制了P的大小,然后再發(fā)一個沒有限制的盧卡斯。
#define MOD 1000000007 typedef long long LL;LL quickPower(LL a, LL b) {LL ans = 1;a %= MOD;while (b){if (b & 1){ans = ans * a % MOD;}b >>= 1;a = a * a % MOD;}return ans; }LL c(LL n, LL m) {if (m > n){return 0;}LL ans = 1;for (int i = 1; i <= m; i++){LL a = (n + i - m) % MOD;LL b = i % MOD;ans = ans * (a * quickPower(b, MOD - 2) % MOD) % MOD;}return ans; }LL lucas(LL n, LL m) {if (m == 0){return 1;}return c(n % MOD, m % MOD) * lucas(n / MOD, m / MOD) % MOD; }int main(int argc, const char * argv[]) {LL n, m;while (~scanf("%lld %lld", &n, &m)){LL max, min;max = n + m - 3;min = m - 1;printf("%lld\n", lucas(max - 1, min - 1));}return 0; }ExLucas擴展盧卡斯定理:
求解Cnm%PC_{n}^{m}\% PCnm?%P,其中m,n較大,P較小且不一定為素數(shù)
轉(zhuǎn)化為CRT(中國剩余定理)
好像這也不是什么定理,只是一個計算方法
計算Cnm%P,其中p=p1q1×p2q2×?pkqk時,我們可以先求出Cmnmodpiqi,然后用CRT合并。那么怎么計算Cmnmodpiqi呢?Cmn=m!n!(m?n)!,我們只需要算出m!,n!?1,(m?n)!?1,然后乘在一起。注:n!可能在模piqi的意義下沒有逆元啊,那這就是錯的了其實這里求得不是逆元(可能沒有逆元),求出來的是a×pib(gcd(a,p)=1),前面的aa用逆元,后面的次數(shù)加加減減一下就好了問題轉(zhuǎn)換成求n!modpq例如n=19,p=3,q=2n=19,p=3,q=2:計算C_{n}^{m}\% P,其中p=p1^{q1}×p2^{q2}×?pk^{qk}時,我們可以先求出C_m^n~mod~{p_i}^{q_i},然后用CRT合并。\\ 那么怎么計算C_m^n~mod~{p_i}^{q_i}呢?\\ C_m^n=\frac{m!}{n!(m-n)!},我們只需要算出m!,n!^{?1},(m?n)!^{?1} ,然后乘在一起。\\ 注:n! 可能在模{p_i}^{q_i}的意義下沒有逆元啊,那這就是錯的了\\ 其實這里求得不是逆元(可能沒有逆元),求出來的是a\times {p_i}^b(gcd(a,p)=1),\\前面的aa用逆元,后面的次數(shù)加加減減一下就好了\\ 問題轉(zhuǎn)換成求n!~mod~p^q\\ 例如n=19,p=3,q=2n=19,p=3,q=2:計算Cnm?%P,其中p=p1q1×p2q2×?pkqk時,我們可以先求出Cmn??mod?pi?qi?,然后用CRT合并。那么怎么計算Cmn??mod?pi?qi?呢?Cmn?=n!(m?n)!m!?,我們只需要算出m!,n!?1,(m?n)!?1,然后乘在一起。注:n!可能在模pi?qi?的意義下沒有逆元啊,那這就是錯的了其實這里求得不是逆元(可能沒有逆元),求出來的是a×pi?b(gcd(a,p)=1),前面的aa用逆元,后面的次數(shù)加加減減一下就好了問題轉(zhuǎn)換成求n!?mod?pq例如n=19,p=3,q=2n=19,p=3,q=2:
參考
19!=1×2×3×?×19=(1×2×4×5×7×8?×16×17×19)×(3×6×9×12×15×18)=(1×2×4×5×7×8?×16×17)×19×36×(1×2×3×4×5×6)=(1×2×4×5×7×8)2×19×36×(1×2×3×4×5×6)19!\\ =1×2×3×?×19\\ =(1×2×4×5×7×8?×16×17×19)×(3×6×9×12×15×18)\\ =(1×2×4×5×7×8?×16×17)×19×36×(1×2×3×4×5×6)\\ =(1×2×4×5×7×8)2×19×36×(1×2×3×4×5×6)19!=1×2×3×?×19=(1×2×4×5×7×8?×16×17×19)×(3×6×9×12×15×18)=(1×2×4×5×7×8?×16×17)×19×36×(1×2×3×4×5×6)=(1×2×4×5×7×8)2×19×36×(1×2×3×4×5×6)
上面這個式子分為四部分:
第一部分:(1×2×4×5×7×8)2(1×2×4×5×7×8)2。這部分的數(shù)不超過pqpq個,可以暴力算第二部分:1919。這部分的數(shù)不超過pqpq個,可以暴力算第三部分:3636。這個在最后處理時求出m!,n!,(m?n)!m!,n!,(m?n)!分別有多少個pp(設(shè)為x,y,zx,y,z),則答案要乘上px?y?zpx?y?z第四部分:1×2×3×4×5×61×2×3×4×5×6。這個是?np?!?np?!,可以遞歸處理第一部分:(1×2×4×5×7×8)2(1×2×4×5×7×8)2。這部分的數(shù)不超過pqpq個,可以暴力算\\ 第二部分:1919。這部分的數(shù)不超過pqpq個,可以暴力算\\ 第三部分:3636。這個在最后處理時求出m!,n!,(m?n)!m!,n!,(m?n)!\\ \qquad\ \ \ \ \ \ \ \ \ \ \ \ 分別有多少個pp(設(shè)為x,y,zx,y,z),則答案要乘上px?y?zpx?y?z\\ 第四部分:1×2×3×4×5×61×2×3×4×5×6。\\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 這個是?np?!?np?!,可以遞歸處理第一部分:(1×2×4×5×7×8)2(1×2×4×5×7×8)2。這部分的數(shù)不超過pqpq個,可以暴力算第二部分:1919。這部分的數(shù)不超過pqpq個,可以暴力算第三部分:3636。這個在最后處理時求出m!,n!,(m?n)!m!,n!,(m?n)!????????????分別有多少個pp(設(shè)為x,y,zx,y,z),則答案要乘上px?y?zpx?y?z第四部分:1×2×3×4×5×61×2×3×4×5×6。????????????????????這個是?np?!?np?!,可以遞歸處理
總結(jié)
以上是生活随笔為你收集整理的『数学』--数论--组合数+卢卡斯定理+扩展卢卡斯定理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LBE安全大师和360哪个好
- 下一篇: u盾是什么?