数论-Lucas(卢卡斯定理)
来源:互联网 发布:卡盟刷q币软件 编辑:程序博客网 时间:2024/06/05 10:36
Lucas定理是用来求 c(n,m) mod p,p为素数的值。
对于C(n, m) mod p。这里的n,m,p(p为素数)都很大的情况。就不能再用C(n, m) = C(n - 1,m) + C(n - 1, m - 1)的公式递推了。
应用:大组合数求模
/*int Lucas (ll n , ll m , int p) { return m == 0 ? 1 : 1ll*comb (n%p , m%p , p) * Lucas (n/p,m/p,p)%p ;}*///comb()函数中,因为q , r < p , 所以这部分暴力完成即可。//C++求C(n, m) mod 10007 版本二 要求p z在100000左右ll f[N];void init(int p) { //f[n] = n! f[0] = 1; for (int i=1; i<=p; ++i) f[i] = f[i-1] * i % p;} ll pow_mod(ll a, ll x, int p){ ll ret = 1; while (x) { if (x & 1) ret = ret * a % p; a = a * a % p; x >>= 1; } return ret;} ll Lucas(ll n, ll k, int p) //C (n, k) % p{ ll ret = 1; while (n && k) { ll nn = n % p, kk = k % p; if (nn < kk) return 0; //inv (f[kk]) = f[kk] ^ (p - 2) % p ret = ret * f[nn] * pow_mod (f[kk] * f[nn-kk] % p, p - 2, p) % p; n /= p, k /= p; } return ret;}int main(void){ init (p); printf ("%I64d\n", Lucas (n, m, p)); return 0;}
也可以采用下面的方法,先把mod的阶乘存起来:
void init(int mod){ //对mod取余后,一定小于mod,因此把mod的阶乘存起来就够用f[0] = 1;for(int i = 1 ; i <= mod ;i ++ ){f[i] = f[i-1] * i % mod;}}void ex_gcd(LL a,LL b,LL& d,LL& x,LL& y){ if(!b) { d = a; x = 1; y = 0; } else{ ex_gcd(b, a%b, d, y, x); y -= x*(a/b); }}LL inv(LL a,LL m) //欧几里得逆元,也可以费马小定理{ LL d, x, y; ex_gcd(a, m, d, x, y); return d == 1 ? (x+m)%m : -1;}LL Lucas(LL m , LL n , LL p){LL res = 1;while(n && m){LL n1 = n % p ;LL m1 = m % p ;res = res * f[n1] * inv(f[n1-m1],p) * inv(f[m1],p)%p;n /= p;m /= p;}return ( res % p + p ) % p;}
阅读全文
0 0
- 数论-Lucas(卢卡斯定理)
- lucas (数论定理)
- lucas数论定理学习
- 数论 Lucas定理 hdu3037
- 卢卡斯定理(Lucas)
- [模板]-卢卡斯(Lucas)定理
- HDU - 3037 Saving Beans (数论,组合数取模,lucas定理)
- 【数论】Lucas定理推导过程+模板
- 数论之Lucas定理及证明过程
- 卢卡斯(Lucas)定理
- HDU3037(Lucas定理)
- lucas定理(hdu3037,)
- hdu6129-( Lucas定理)
- [数论] 组合数取模 中国剩余定理 Lucas定理
- 【数论定理】卢卡斯定理
- hdu 3037 Saving Beans(lucas定理)(卢卡斯定理)
- 教你一波Lucas(卢卡斯)定理在数论解题中的应用
- CPC23-4-K. 喵喵的神数 (数论 Lucas定理)
- Leetcode_88_Merge Sorted Array
- tp5项目实现QQ第三方登录
- C# 删除文件夹中特定前缀文件
- CSS 浮动 float 清除浮动 clear 最容易理解的文章
- 安装minGW编译器及其使用方法
- 数论-Lucas(卢卡斯定理)
- Shuffle'm Up
- FPGA
- struct与class的区别
- A抽屉
- 1003. Emergency (25)
- API Hook总结之五
- 剑指Offer——合并两个排序的链表
- DIV里面的图片水平与垂直居中的方法