最近碰到一题,问你求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+rq , 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)   (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定理相关推荐

  1. [Swust OJ 247]--皇帝的新衣(组合数+Lucas定理)

    题目链接:http://acm.swust.edu.cn/problem/0247/ Time limit(ms): 1000 Memory limit(kb): 65535 Description ...

  2. 组合数(Lucas定理) + 快速幂 --- HDU 5226 Tom and matrix

    Tom and matrix Problem's Link:   http://acm.hdu.edu.cn/showproblem.php?pid=5226 Mean: 题意很简单,略. analy ...

  3. Lucas定理与大组合数的取模的求法总结

    Lucas定理与大组合数的取模的求法总结 分类: ACMer 数学 2012-03-11 09:38  1219人阅读  评论(0)  收藏  举报 c 首先给出这个Lucas定理: A.B是非负整数 ...

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

  5. lucas求大组合数

    Lucas 定理 Lucas 定理用于求解大组合数取模的问题,其中 p 必须为素数.正常的组合数运算可以通过递推公式求解,但当问题规模很大,而模数是一个不大的质数的时候,就不能简单地通过递推求解来得到 ...

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

  7. BZOJ4737 组合数问题 【Lucas定理 + 数位dp】

    题目 组合数C(n,m)表示的是从n个物品中选出m个物品的方案数.举个例子,从(1,2,3)三个物品中选择两个物品可以有( 1,2),(1,3),(2,3)这三种选择方法.根据组合数的定义,我们可以给 ...

  8. 『Lucas定理以及拓展Lucas』

    Lucas定理 在『组合数学基础』中,我们已经提出了\(Lucas\)定理,并给出了\(Lucas\)定理的证明,本文仅将简单回顾,并给出代码. \(Lucas\)定理:当\(p\)为质数时,\(C_ ...

  9. BZOJ1951 [Sdoi2010]古代猪文 【费马小定理 + Lucas定理 + 中国剩余定理 + 逆元递推 + 扩展欧几里得】...

    题目 "在那山的那边海的那边有一群小肥猪.他们活泼又聪明,他们调皮又灵敏.他们自由自在生活在那绿色的大草坪,他们善良勇敢相互都关心--" --选自猪王国民歌 很久很久以前,在山的那 ...

  10. Lucas定理:线性求所有逆元的方法

    Miskcoo's Space,版权所有丨如未注明,均为原创 转载请注明转自:http://blog.miskcoo.com/2014/09/linear-find-all-invert 主要绕过费马 ...

最新文章

  1. 10个非常有趣的Linux命令
  2. 今年的谷歌I/O大会,或许会有这些东西
  3. python中in的底层实现_python中print和input的底层实现
  4. python dlib opencv人脸识别准确度_Python用opencv+dlib实现人脸识别
  5. python爬带用户名密码的网页_python爬虫用户名密码登录POST
  6. 无需安装Oracle,直接使用PL/SQL的方法
  7. WCF服务实例激活类型编程与开发(转)
  8. 自动放大_放大招!滴滴自动驾驶汽车通过图灵测试,quot;车技quot;不输老司机...
  9. Linux常用命令(掌握完操作Linux基本就够用了)
  10. iis8.5限速没有效果怎么回事_电梯为何会发生坠梯?没有安全措施吗?能在井道底安装大弹簧吗?...
  11. diff算法_Virtual Dom和Diff算法
  12. VSS 2005 配置简明手册
  13. Vmware中linux端口映射,让外网/ssh访问虚拟机Linux
  14. C语言课程设计--推箱子
  15. ctworklist php开发,DICOM worklist工作原理
  16. goldendict无法导入字典
  17. python解析HL7协议多方式对比
  18. 计算机教学反思杂文,教学反思或随笔
  19. BadgeView使用介绍
  20. Python设置Latex公式中显示数学字体STIX

热门文章

  1. 配置centOS下的Python
  2. “requireJs前传”之为什么要用前端模块化?
  3. ITOO 第一个任务,新建界面
  4. Container with most water
  5. Web storm 部分快捷键
  6. 【算法与数据结构】哈希表-链地址法
  7. 记一次VS Code崩溃的解决(Win10扫描自动回复系统文件)
  8. 【MySQL】5.7新特性之四
  9. freemark 应用以及优势
  10. php error file_get_contents()