大组合数:Lucas定理
最近碰到一题,问你求mod (p1*p2*p3*……*pl) ,其中n和m数据范围是1~1e18 , l ≤10 , pi ≤ 1e5为不同的质数,并保证M=p1*p2*p3*……*pl ≤ 1e18 。
要解决这个问题首先需要Lucas定理 或者 C!解法。
Lucas定理:
我们令n=sp+q , m=tp+r . q , r ≤ p
那么,然后你只要继续对调用Lucas定理即可。
代码可以递归的去完成这个过程,其中递归终点为t = 0 ;
伪代码,时间O(logp(n)*p):
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 , 所以这部分暴力完成即可。
Lucas定理证明:
证明资料:http://www.cut-the-knot.org/arithmetic/algebra/LucasTheorem.shtml
首先你需要这个算式:,然后
(1 + x) n Ξ (1 + x) sp+q Ξ ( (1 + x)p)s • (1 + x) qΞ (1 + xp) s • (1 + x) q (mod p) ;
.
所以,通过左右系数比较,你就会发现当i=t , j=r ,(及xtp+r的系数等式)成立。
题目:http://acm.hdu.edu.cn/showproblem.php?pid=5446
#include<bits/stdc++.h>
using namespace std;
typedef long long ll ;
const int M = 1e5 + 10 ;
ll n , m ;
int k ;
int prime[15] ;
int rem[15] ;ll MM ;int F[15] ;
//int Finv[15][M] , F[15][M] , inv[15][M] ;ll mul (ll a , ll b , ll mod) {ll tmp = 0 ;while (b) {if (b & 1) tmp = (1ll*tmp+a)%mod ;b >>= 1 ;a = (a+a)%mod ;}return tmp ;
}int Fermat (ll a , int b) {int ret = 1 ;int mod = b ;b -= 2 ;while (b) {if (b & 1) ret = mul(ret , a , mod) ;b >>= 1 ;a = mul(a , a , mod) ;}return ret ;
}int fact (int n , int p) {int ret = 1 ;for (int i = 1 ; i <= n ; i ++) ret = 1ll*ret*i%p ;return ret ;
}int comb (int n , int m , int p) {if (m < 0 || m > n) return 0 ;return 1ll* fact (n , p) * Fermat(fact (m , p) , p) * Fermat (fact(n-m , p) , p) % p ;
}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 ;
}void solve () {MM = 1 ;for (int i = 1 ; i <= k ; i ++) {rem[i] = Lucas (n , m , prime[i]) ;MM *= 1ll*prime[i] ;//cout << "rem[i] = " << rem[i] << endl;}ll sum = 0 ;for (int i = 1 ; i <= k ; i ++) {ll tmp = MM/prime[i] ;ll ans = mul (rem[i] , Fermat(tmp , prime[i]) , MM) ;sum = (sum + mul (ans , tmp , MM) ) % MM ;}printf ("%I64d\n" , sum);
}int main () {int T ;scanf ("%d" , &T) ;while (T --) {scanf ("%I64d%I64d%d\n" , &n , &m , &k) ;for (int i = 1 ; i <= k ; i ++) {scanf ("%d" , &prime[i]) ;}solve () ;}return 0 ;
}
转载于:https://www.cnblogs.com/get-an-AC-everyday/p/4813692.html
大组合数:Lucas定理相关推荐
- [Swust OJ 247]--皇帝的新衣(组合数+Lucas定理)
题目链接:http://acm.swust.edu.cn/problem/0247/ Time limit(ms): 1000 Memory limit(kb): 65535 Description ...
- 组合数(Lucas定理) + 快速幂 --- HDU 5226 Tom and matrix
Tom and matrix Problem's Link: http://acm.hdu.edu.cn/showproblem.php?pid=5226 Mean: 题意很简单,略. analy ...
- Lucas定理与大组合数的取模的求法总结
Lucas定理与大组合数的取模的求法总结 分类: ACMer 数学 2012-03-11 09:38 1219人阅读 评论(0) 收藏 举报 c 首先给出这个Lucas定理: A.B是非负整数 ...
- Lucas定理及组合数取模
首先给出这个Lucas定理: A.B是非负整数,p是质数.AB写成p进制:A=a[n]a[n-1]...a[0],B=b[n]b[n-1]...b[0]. 则组合数C(A,B)与C(a[n],b[n] ...
- lucas求大组合数
Lucas 定理 Lucas 定理用于求解大组合数取模的问题,其中 p 必须为素数.正常的组合数运算可以通过递推公式求解,但当问题规模很大,而模数是一个不大的质数的时候,就不能简单地通过递推求解来得到 ...
- 2015 ICL, Finals, Div. 1 Ceizenpok’s formula(组合数取模,扩展lucas定理)
J. Ceizenpok's formula time limit per test 2 seconds memory limit per test 256 megabytes input stand ...
- BZOJ4737 组合数问题 【Lucas定理 + 数位dp】
题目 组合数C(n,m)表示的是从n个物品中选出m个物品的方案数.举个例子,从(1,2,3)三个物品中选择两个物品可以有( 1,2),(1,3),(2,3)这三种选择方法.根据组合数的定义,我们可以给 ...
- 『Lucas定理以及拓展Lucas』
Lucas定理 在『组合数学基础』中,我们已经提出了\(Lucas\)定理,并给出了\(Lucas\)定理的证明,本文仅将简单回顾,并给出代码. \(Lucas\)定理:当\(p\)为质数时,\(C_ ...
- BZOJ1951 [Sdoi2010]古代猪文 【费马小定理 + Lucas定理 + 中国剩余定理 + 逆元递推 + 扩展欧几里得】...
题目 "在那山的那边海的那边有一群小肥猪.他们活泼又聪明,他们调皮又灵敏.他们自由自在生活在那绿色的大草坪,他们善良勇敢相互都关心--" --选自猪王国民歌 很久很久以前,在山的那 ...
- Lucas定理:线性求所有逆元的方法
Miskcoo's Space,版权所有丨如未注明,均为原创 转载请注明转自:http://blog.miskcoo.com/2014/09/linear-find-all-invert 主要绕过费马 ...
最新文章
- 10个非常有趣的Linux命令
- 今年的谷歌I/O大会,或许会有这些东西
- python中in的底层实现_python中print和input的底层实现
- python dlib opencv人脸识别准确度_Python用opencv+dlib实现人脸识别
- python爬带用户名密码的网页_python爬虫用户名密码登录POST
- 无需安装Oracle,直接使用PL/SQL的方法
- WCF服务实例激活类型编程与开发(转)
- 自动放大_放大招!滴滴自动驾驶汽车通过图灵测试,quot;车技quot;不输老司机...
- Linux常用命令(掌握完操作Linux基本就够用了)
- iis8.5限速没有效果怎么回事_电梯为何会发生坠梯?没有安全措施吗?能在井道底安装大弹簧吗?...
- diff算法_Virtual Dom和Diff算法
- VSS 2005 配置简明手册
- Vmware中linux端口映射,让外网/ssh访问虚拟机Linux
- C语言课程设计--推箱子
- ctworklist php开发,DICOM worklist工作原理
- goldendict无法导入字典
- python解析HL7协议多方式对比
- 计算机教学反思杂文,教学反思或随笔
- BadgeView使用介绍
- Python设置Latex公式中显示数学字体STIX