题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5446

C(n, m) % (p1*p2*p3*...*pk)的值

其实这个就是中国剩余定理最后算出结果后的最后一步求余

那C(n, m)相当于以前我们需要用中国剩余定理求的值

然而C(n, m)太大,我们只好先算出

C(n, m) % p1 = r1

C(n, m) % p2 = r2

C(n, m) % p3 = r3

.

.

.

C(n, m) % pk = rk

用Lucas,这些r1,r2,r3...rk可以算出来

然后用中国剩余定理求满足num%p[i]=r[i]的最小num即可,num既是所求答案;

注意在运算过程中会出现数相乘爆long long,所以要手动写乘法求余;

  1. #include <iostream>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <string>
  5. #include <vector>
  6. #include <algorithm>
  7. #include <map>
  8. #include <queue>
  9. #include <stack>
  10. #include <math.h>
  11.  
  12. using namespace std;
  13.  
  14. #define met(a, b) memset(a, b, sizeof(a))
  15. #define N 153
  16. #define INF 0x3f3f3f3f
  17.  
  18. typedef long long LL;
  19.  
  20. ///快速幂计算a*b%p,因为a*b直接相乘可能会爆LL;
  21. LL Mul(LL a, LL b, LL p)
  22. {
  23. a = (a+p)%p;
  24. b = (b+p)%p;
  25. LL ans = ;
  26. while(b)
  27. {
  28. if(b%)
  29. ans = (ans+a)%p;
  30. a=(a+a)%p;
  31. b/=;
  32. }
  33. return ans;
  34. }
  35.  
  36. ///用快速幂求a^b%p;
  37. LL quick_mod(LL a, LL b, LL p)
  38. {
  39. LL ans = ;
  40. a %= p;
  41. while(b)
  42. {
  43. if(b&)
  44. {
  45. ans = ans*a%p;
  46. b--;
  47. }
  48. b = b/;
  49. a = a*a%p;
  50. }
  51. return ans;
  52. }
  53. ///求C(n, m)%p;
  54. LL C(LL n, LL m, LL p)
  55. {
  56. if(m > n)return ;
  57. LL ans = ;
  58. for(int i=; i<=m; i++)
  59. {
  60. LL a = (n+i-m)%p;
  61. LL b = i%p;
  62. ans = ans*(a*quick_mod(b, p-, p)%p)%p;
  63. }
  64. return ans;
  65. }
  66. ///卢卡斯用于求C(n, m)%p;
  67. LL Lucas(LL n, LL m, LL p)
  68. {
  69. if(m == )return ;
  70. return C(n%p, m%p, p) * Lucas(n/p, m/p, p)%p;
  71. }
  72. ///扩展欧几里德 求ax+by = gcd(a, b)中的x和y
  73. void ex_gcd(LL a, LL b, LL &x, LL &y)
  74. {
  75. if(b == )
  76. {
  77. x = ;
  78. y = ;
  79. return;
  80. }
  81. ex_gcd(b, a%b, x, y);
  82. int t = x;
  83. x = y;
  84. y = t - a/b*y;
  85. if( a*b < )///当ab异号时;
  86. {
  87. x = -x;
  88. y = -y;
  89. }
  90. }
  91. ///已知 num%p[i]=r[i];求满足n个式子的最小num,其中p[i]是素数;
  92. LL China(int n, LL p[], LL r[])
  93. {
  94. LL m = , num = ;
  95. for(int i=; i<=n; i++)
  96. m *= p[i];
  97. for(int i=; i<=n; i++)
  98. {
  99. LL x, y, a = m/p[i], b = -p[i];
  100. ex_gcd(a, b, x, y);
  101. LL t = Mul(a, x, m);///Mul就是乘法,防止爆longlong;
  102. num = (num + Mul(t, r[i], m) + m) % m;
  103. }
  104. return (num+m)%m;
  105. }
  106.  
  107. int main()
  108. {
  109. LL n, m;
  110. int k, T;
  111. scanf("%d", &T);
  112. while(T--)
  113. {
  114. LL p[], r[];
  115. scanf("%I64d %I64d %d", &n, &m, &k);
  116. for(int i=; i<=k; i++)
  117. {
  118. scanf("%I64d", &p[i]);
  119. r[i] = Lucas(n, m, p[i]);
  120. }
  121. printf("%I64d\n", China(k, p, r));
  122. }
  123. return ;
  124. }

Unknown Treasure---hdu5446(卢卡斯+中国剩余定理)的更多相关文章

  1. ACM-ICPC 2015 Changchun Preliminary Contest J. Unknown Treasure (卢卡斯定理+中国剩余定理)

    题目链接:https://nanti.jisuanke.com/t/A1842 题目大意:给定整数n,m,k,其中1≤m≤n≤1018,k≤10, 然后给出k个素数,保证M=p[1]*p[2]……*p ...

  2. Unknown Treasure (卢卡斯 + 孙子定理, 模板题)

    Unknown Treasure 参考链接 : https://www.cnblogs.com/linyujun/p/5199684.html 卢卡斯定理 : C(n, m) % p  =  C(n ...

  3. Unknown Treasure(hdu5446)

    Unknown Treasure Time Limit: 1500/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Other ...

  4. Hdu 5446 Unknown Treasure (2015 ACM/ICPC Asia Regional Changchun Online Lucas定理 + 中国剩余定理)

    题目链接: Hdu 5446 Unknown Treasure 题目描述: 就是有n个苹果,要选出来m个,问有多少种选法?还有k个素数,p1,p2,p3,...pk,结果对lcm(p1,p2,p3.. ...

  5. HDU 5446 Unknown Treasure Lucas+中国剩余定理+按位乘

    HDU 5446 Unknown Treasure 题意:求C(n, m) %(p[1] * p[2] ··· p[k])     0< n,m < 1018 思路:这题基本上算是模版题了 ...

  6. hdu 5446 Unknown Treasure 中国剩余定理+lucas

    题目链接 求C(n, m)%p的值, n, m<=1e18, p = p1*p2*...pk. pi是质数. 先求出C(n, m)%pi的值, 然后这就是一个同余的式子. 用中国剩余定理求解. ...

  7. Lucas+中国剩余定理 HDOJ 5446 Unknown Treasure

    题目传送门 题意:很裸,就是求C (n, m) % (p1 * p2 * p3 * .... * pk) 分析:首先n,m<= 1e18, 要用到Lucas定理求大组合数取模,当然p[]的乘积& ...

  8. HDU 5446 Unknown Treasure(lucas + 中国剩余定理 + 模拟乘法)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5446 题目大意:求C(n, m) % M, 其中M为不同素数的乘积,即M=p1*p2*...*pk, ...

  9. [SDOI2010] 古代猪文 (快速幂+中国剩余定理+欧拉定理+卢卡斯定理) 解题报告

    题目链接:https://www.luogu.org/problemnew/show/P2480 题目背景 “在那山的那边海的那边有一群小肥猪.他们活泼又聪明,他们调皮又灵敏.他们自由自在生活在那绿色 ...

随机推荐

  1. 资深投资人全力反击: VC增值平台从来就不是一坨狗屎

    编者注: 本文来自海外著名科技博客VentureBeat, 英文原文出自Kyle Lacy之手 ,中文版由天地会珠海分舵进行编译. 文章主要是针对前几天德国VC Christian Claussen的 ...

  2. c++ ifstream

    1.判断文件是否打开if(a.fail())if(!a.good())if(!a)上面3个等价 但上面的无法检测到 : 以不合适的文件模式打开文件失败a.is_open()可以检测到这个错误 所以推荐 ...

  3. 视觉SLAM漫淡

    视觉SLAM漫谈 1.    前言 开始做SLAM(机器人同时定位与建图)研究已经近一年了.从一年级开始对这个方向产生兴趣,到现在为止,也算是对这个领域有了大致的了解.然而越了解,越觉得这个方向难度很 ...

  4. MySQL<事务与存储过程>

    事务与存储过程 事务管理 事务的概念 谓的事务就是针对数据库的一组操作,它可以由一条或多条SQL语句组成,同一个事务的操作具备同步的特点,即事务中的语句要么都执行,要么都不执行. 事务的使用 开启事务 ...

  5. redis的初认识

    Redis是一个开源,先进的key-value存储,并用于构建高性能,可扩展的Web应用程序的完美解决方案. Redis从它的许多竞争继承来的三个主要特点: Redis数据库完全在内存中,使用磁盘仅用 ...

  6. Dubbo注册中心Zookeeper安装步骤

    第一步:安装jdk 第二步:上传zookeeper至Linux 第三步:解压zookeeper安装包(/soft目录是我在根目录下建立的一个用户存放上传安装包的目录),解压命令tar -xvf /so ...

  7. Android 监听按钮的点击事件

    onClick事件1.Button和ImageButton都拥有一个onClick事件 通过自身的.setOnClickListener(OnClickListener)方法添加点击事件2.所有的控件 ...

  8. php第二例

    参考: http://www.php.cn/code/3645.html 前言 由于navicat在linux平台不能很好的支持, PHP的学习转到windows平台. php IDE: PhpSto ...

  9. 安装postgresql之后为什么找不到postgresql service

    没有正常启动 postgresql service.可以 在运行里面 输入 services.msc 找到 postgresql 的服务.启动他.或者也可以用postgres 自带的 工具pg_ctl ...

  10. c#截取图片

    简单的保存数据流 <input name="upImg" style="width: 350px; height: 25px;" size="3 ...