卢卡斯定理模板(当n和m很大,p为素数时)
2018-03-01 14:56
316 查看
#include <string.h> #include <stdio.h> #include <iostream> #include <algorithm> typedef long long LL; using namespace std; LL exp_mod(LL a, LL b, LL p) { LL res = 1; while(b != 0) { if(b&1) res = (res * a) % p; a = (a*a) % p; b >>= 1; } return res; } LL Comb(LL a, LL b, LL p) { if(a < b) return 0; if(a == b) return 1; if(b > a - b) b = a - b; LL ans = 1, ca = 1, cb = 1; for(LL i = 0; i < b; ++i) { ca = (ca * (a - i))%p; cb = (cb * (b - i))%p; } ans = (ca*exp_mod(cb, p - 2, p)) % p; return ans; } LL Lucas(int n, int m, int p) { LL ans = 1; while(n&&m&&ans) { ans = (ans*Comb(n%p, m%p, p)) % p; n /= p; m /= p; } return ans; } int main() { int n, m, p=1e9+7; while(~scanf("%d%d", &n, &m)) { printf("%lld\n", Lucas(n, m, p)); } return 0; }
相关文章推荐
- LightOJ - 1124 同codeforce-451E (隔板法,卢卡斯定理,当n和m很大,p为任意素数时)
- 【模板】卢卡斯定理
- 洛谷—— P3807 【模板】卢卡斯定理
- 【洛谷】3807 【模板】卢卡斯定理
- 大组合数取模之lucas定理模板,1<=n<=m<=1e9,1<p<=1e6,p必须为素数 复制代码
- 扩展欧几里得、求乘法逆元及其应用、中国剩余定理(互质版和非互质版)、欧拉函数、快速判素数模板
- [模板]-卢卡斯(Lucas)定理
- 洛谷P3807 【模板】卢卡斯定理exgcd
- 数论快速入门(同余、扩展欧几里德、中国剩余定理、大素数测定和整数分解、素数三种筛法、欧拉函数以及各种模板)
- 组合数模板+ 卢卡斯定理
- [Luogu 3807]【模板】卢卡斯定理
- 【Luogu3807】【模板】卢卡斯定理(数论)
- 求n很大时求,<= n的素数的个数(时间复杂度o(n ^ 2 / 3)模板
- luogu P3807 【模板】卢卡斯定理
- 卢卡斯定理的模板以及应用
- 大组合数取模之lucas定理模板,1<=n<=m<=1e9,1<p<=1e6,p必须为素数
- 组合数取模(卢卡斯定理、模板)
- 洛谷 P3807 【模板】卢卡斯定理
- 洛谷.3807.[模板]卢卡斯定理(Lucas)
- [模板] 卢卡斯定理