http://acm.hdu.edu.cn/showproblem.php?pid=5446

题意:题目意思很简单,要你求C(n,m)mod p的值 p=p1*p2*...pn;

题解:对于C(n,m)mod p 由于n,m的值很大 我们用lucas定理把n,m的范围缩小。由于模数是由若干个素数的乘积组成,那么对于最终要求的解x,我们可以用中国剩余定理求解。中国剩余定理如下:

设正整数两两互素,则同余方程组

有整数解。并且在模下的解是唯一的,解为

其中,而的逆元。

最后说一点,由于数据的范围还是比较大,在乘法求解的过程中,如果用普通的乘法,是会溢出的,这里还要用到按位乘法(具体看代#include <cstdio>#include <iostream>

  1. #include <cstring>
  2. #include <iostream>
  3. using namespace std;
  4. typedef long long ll;
  5. ll m[],a[];
  6. ll mul(ll a,ll b,ll p)// 按位乘
  7. {
  8. ll ret=;
  9. while(b)
  10. {
  11. if(b&) ret=(ret+a)%p;
  12. b=b>>;
  13. a=(a+a)%p;
  14. }
  15. return ret;
  16. }
  17. ll exgcd(ll a,ll b,ll &x,ll &y)// 扩展欧几里得
  18. {
  19. if(b==)
  20. {
  21. x=;
  22. y=;
  23. return a;
  24. }
  25. ll temp=exgcd(b,a%b,y,x);
  26. y-=(a/b)*x;
  27. return temp;
  28. }
  29. ll finv(ll a,ll m)// 求逆元
  30. {
  31. ll x,y;
  32. ll g=exgcd(a,m,x,y);
  33. x=(x%m+m)%m;//
  34. return x;
  35. }
  36. ll c(ll n,ll m,ll p)
  37. {
  38. if(m > n) return ;
  39. ll a,b;
  40. a=b=;
  41. while(m)
  42. {
  43. a=(a*n)%p;
  44. b=b*m%p;
  45. n--;
  46. m--;
  47. }
  48. return mul(a,finv(b,p),p);
  49. }
  50. ll lucas(ll n,ll m,int p)
  51. {
  52. if(m==) return ;// c(n,0)=1;
  53. return mul(lucas(n/p,m/p,p),c(n%p,m%p,p),p);// lucas把组合数要求解的范围缩小到了p之内
  54. }
  55. ll crt(int len)
  56. {
  57. ll sum=;
  58. ll M=;
  59. for(int i=;i<=len;i++) M*=m[i];
  60. for(int i=;i<=len;i++)
  61. {
  62. ll temp=M/m[i];
  63. sum=(sum+mul(mul(a[i],temp,M),finv(temp,m[i]),M))%M;// 这里有一个数据溢出的问题 对于相乘数据会溢出的问题 用转为二进制的按位乘法
  64. }
  65. return sum;
  66. }
  67. void init(ll p)
  68. {
  69. fac[]=;
  70. fac[]=;
  71. for(ll i=;i<=p;i++) fac[i]=fac[i]*i%p;
  72. }
  73. int main()
  74. {
  75. cin.sync_with_stdio(false);
  76. int t;
  77. cin>>t;
  78. while(t--)
  79. {
  80. ll n,mm,k;
  81. cin>>n>>mm>>k;
  82. init(k);
  83. for(int i=;i<=k;i++)
  84. {
  85. cin>>m[i];
  86. a[i]=lucas(n,mm,m[i]);
  87. }
  88. cout<<crt(k)<<endl;
  89. }
  90. return ;
  91. }

hdu 5446 lucas+crt+按位乘的更多相关文章

  1. HDU 5446 lucas CRT

    n中选m个模M,M为多个素数之积 $n, m, k (1 \leq m \leq n \leq 10^{18}, 1 \leq k \leq 10)$,$M = p_1 · p_2 · · · p_k ...

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

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

  3. 中国剩余定理&Lucas定理&按位与——hdu 5446

    链接: hdu 5446 http://acm.hdu.edu.cn/showproblem.php?pid=5446 题意: 给你三个数$n, m, k$ 第二行是$k$个数,$p_1,p_2,p_ ...

  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定理+CRT)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5446 [题目大意] 给出一个合数M的每一个质因子,同时给出n,m,求C(n,m)%M. [题解] ...

  6. hdu 5446 Unknown Treasure lucas和CRT

    Unknown Treasure Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?p ...

  7. hdu 5446(中国剩余+lucas+按位乘)

    题意:c( n, m)%M    M = P1 * P2 * ......* Pk Lucas定理是用来求 c(n,m) mod p,p为素数的值.得出一个存余数数组,在结合中国剩余定理求值 其中有个 ...

  8. HDU 5446——Unknown Treasure——————【CRT+lucas+exgcd+快速乘+递推求逆元】

    Each test case starts with three integers n,m,k(1≤m≤n≤1018,1≤k≤10) on a line where k is the number o ...

  9. HDU 5446 CRT+Lucas+快速乘

    Unknown Treasure Problem Description On the way to the next secret treasure hiding place, the mathem ...

随机推荐

  1. ArcGIS超级工具SPTOOLS-按属性裁剪,矢量数据批量裁剪,矢量数据批量合库

    1.1  按属性裁剪 操作视频: https://weibo.com/tv/v/HwaZRoosq?fid=1034:4376687438183117 按属性裁剪:可以图形表,也可以是非图形表,字段值 ...

  2. mysql 给用户设置权限

    grant   all   on   wordpress.*   to  wordpress@'10.0.0.%'  identified  by  'wordpress'; all    全部权限 ...

  3. PHP学习之图像处理-水印类

    <?php $image = new Image(); $image->water('./upload/up_5cf0caca0565b.png','./upload/up_5cf0cb3 ...

  4. 分布式系统的应用程序性能监视工具,专为微服务、云本机架构和基于容器(Docker、K8s、Mesos)架构而设计。 SkyWalking

    Apache SkyWalking™ | SkyWalking Teamhttp://skywalking.apache.org/zh/ Application performance monitor ...

  5. kotlin之函数的基本用法

    fun main(arg: Array<String>) { val )//调用函数 print(double) } fun double(x:Int):Int{ *x } kotlin函 ...

  6. js常用正则(2)

    res(a, b, str) { //数字加英文 let re = `\^\\w{${a},${b}}\$` let reg = new RegExp(re); let status = !reg.t ...

  7. realsense数据分析

    line: (434,300) (453,144) (0,0,0),(-0.926698,-1.25853,2.032) 0.781452 ------------------------------ ...

  8. 三种单点登录SSO的实现原理

    单点登录SSO(Single Sign On)说得简单点就是在一个多系统共存的环境下,用户在一处登录后,就不用在其他系统中登录,也就是用户的一次登录能得到其他所有系统的信任.单点登录在大型网站里使用得 ...

  9. JAVA 基础编程练习题17 【程序 17 猴子吃桃问题】

    17 [程序 17 猴子吃桃问题] 题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个 第二天早上又 将剩下的桃子吃掉一半,又多吃了一个.以后每天早上都吃了前一天剩下的一 ...

  10. Node.js使用Express实现Get和Post请求

    var express = require('express'); var app = express(); // 主页输出 "Hello World" app.get('/', ...