【BZOJ4891】[TJOI2017]龙舟(Pollard_rho)

题面

BZOJ

洛谷

题解

看了半天题....就是让你求\(\frac{b}{a}\)在模\(M\)意义下的值。。。

首先把\(M\)分解,把\(a,b\)中的这些质因子全部分解出来,剩下的部分和\(M\)互质,直接求逆就行了,分解出来的部分如果分母大于分子,显然无逆,输出-1就行了。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstdlib>
  4. #include<cstring>
  5. #include<cmath>
  6. #include<algorithm>
  7. #include<vector>
  8. using namespace std;
  9. #define ll long long
  10. inline ll read()
  11. {
  12. ll x=0;bool t=false;char ch=getchar();
  13. while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
  14. if(ch=='-')t=true,ch=getchar();
  15. while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
  16. return t?-x:x;
  17. }
  18. ll Multi(ll x,ll y,ll MOD){ll s=x*y-(ll)((long double)x/MOD*y+0.5)*MOD;return s<0?s+MOD:s;}
  19. ll fpow(ll a,ll b,ll MOD){ll s=1;while(b){if(b&1)s=Multi(s,a,MOD);a=Multi(a,a,MOD);b>>=1;}return s;}
  20. bool Miller_Rabin(ll n)
  21. {
  22. if(n==2)return true;
  23. for(int tim=10;tim;--tim)
  24. {
  25. ll a=rand()%(n-2)+2,p=n-1;
  26. if(fpow(a,n-1,n)!=1)return false;
  27. while(!(p&1))
  28. {
  29. p>>=1;ll nw=fpow(a,p,n);
  30. if(Multi(nw,nw,n)==1&&nw!=1&&nw!=n-1)return false;
  31. }
  32. }
  33. return true;
  34. }
  35. ll Pollard_Rho(ll n,int c)
  36. {
  37. ll i=0,k=2,x=rand()%(n-1)+1,y=x;
  38. while(233)
  39. {
  40. ++i;x=(Multi(x,x,n)+c)%n;
  41. ll d=__gcd((y-x+n)%n,n);
  42. if(d!=1&&d!=n)return d;
  43. if(x==y)return n;
  44. if(i==k)k<<=1,y=x;
  45. }
  46. }
  47. void Fact(ll n,int c,vector<ll> &fac)
  48. {
  49. if(n==1)return;
  50. if(Miller_Rabin(n)){fac.push_back(n);return;}
  51. ll p=n;while(p>=n)p=Pollard_Rho(n,c--);
  52. Fact(p,c,fac);Fact(n/p,c,fac);
  53. }
  54. int n,m,Q;ll a[25][10100];
  55. int pri[100];
  56. int main()
  57. {
  58. n=read();m=read();Q=read();
  59. for(int i=0;i<=n;++i)
  60. for(int j=1;j<=m;++j)a[i][j]=read();
  61. while(Q--)
  62. {
  63. int x=read();ll MOD=read(),phi=MOD;int tot;
  64. vector<ll> fac;Fact(MOD,233,fac);
  65. sort(fac.begin(),fac.end());fac.resize(tot=unique(fac.begin(),fac.end())-fac.begin());
  66. for(int i=0;i<tot;++i)phi=phi-phi/fac[i];
  67. ll inv=1,ans=1;
  68. for(int i=1;i<=m;++i)
  69. {
  70. ll p=a[0][i];
  71. for(int j=0;j<tot;++j)
  72. while(p%fac[j]==0)p/=fac[j],++pri[j];
  73. ans=Multi(ans,p,MOD);
  74. }
  75. for(int i=1;i<=m;++i)
  76. {
  77. ll p=a[x][i];
  78. for(int j=0;j<tot;++j)
  79. while(p%fac[j]==0)p/=fac[j],--pri[j];
  80. inv=Multi(inv,p,MOD);
  81. }
  82. bool fl=true;
  83. for(int i=0;i<tot;++i)if(pri[i]<0){fl=false;break;}
  84. if(fl)
  85. {
  86. for(int i=0;i<tot;++i)if(pri[i])ans=Multi(ans,fpow(fac[i],pri[i],MOD),MOD);
  87. ans=Multi(ans,fpow(inv,phi-1,MOD),MOD);printf("%lld\n",ans);
  88. }
  89. else puts("-1");
  90. for(int i=0;i<tot;++i)pri[i]=0;
  91. }
  92. return 0;
  93. }

【BZOJ4891】[TJOI2017]龙舟(Pollard_rho)的更多相关文章

  1. BZOJ4891:[TJOI2017]龙舟(Pollard-Rho,exgcd)

    Description 加里敦大学有一个龙舟队,龙舟队有n支队伍,每只队伍有m个划手,龙舟比赛是一个集体项目,和每个人的能力息息相关,但由于龙舟讲究配合,所以评价队伍的能力的是一个值c = (b1*b ...

  2. BZOJ4891 TJOI2017龙舟(Polllard-Rho)

    对给定模数分解质因数后约分即可.依然常数巨大过不了. #include<iostream> #include<cstdio> #include<cmath> #in ...

  3. bzoj4891: [Tjoi2017]龙舟

    求$\frac{b_1b_2b_3...b_m}{a_1a_2a_3...a_m}\%M$ M<=1e18,m<=100000,数据组数<=50 用pollard-rho分解M的质因 ...

  4. 【BZOJ-4522】密钥破解 数论 + 模拟 ( Pollard_Rho分解 + Exgcd求逆元 + 快速幂 + 快速乘)

    4522: [Cqoi2016]密钥破解 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 290  Solved: 148[Submit][Status ...

  5. 数论 - Miller_Rabin素数测试 + pollard_rho算法分解质因数 ---- poj 1811 : Prime Test

    Prime Test Time Limit: 6000MS   Memory Limit: 65536K Total Submissions: 29046   Accepted: 7342 Case ...

  6. HDU-3864 D_num Miller_Rabin和Pollard_rho

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3864 题意:给定一个数n,求n的因子只有四个的情况. Miller_Rabin和Pollard_rho ...

  7. pollard_rho和Miller_Rabin

    Miller_Rabin就是以概论大小来判断素数 可以判断2^63范围的数 pollard_rho推荐两个很好的博客来理解:整数分解费马方法以及Pollard rho和[ZZ]Pollard Rho算 ...

  8. 【转】大素数判断和素因子分解【miller-rabin和Pollard_rho算法】

    集训队有人提到这个算法,就学习一下,如果用到可以直接贴模板,例题:POJ 1811 转自:http://www.cnblogs.com/kuangbin/archive/2012/08/19/2646 ...

  9. poj 2429 Pollard_rho大数分解

    先对lcm/gcd进行分解,问题转变为从因子中选出一些数相乘,剩下的数也相乘,要求和最小. 这里能够直接搜索,注意一个问题,因为同样因子不能分配给两边(会改变gcd)所以能够将同样因子合并,这种话,搜 ...

随机推荐

  1. 容器化-Docker实战

    导读:本文系统性介绍Docker安装.Docker组件.Docker命令.Dockerfile语法和Docker应用,通过上述介绍使我们已经对docker基本操作有一定了解. 一.前言 本文将系统性的 ...

  2. Volterra方程的不动点

  3. html总结:float实现span和input输入框同行

    例: <input type="text" name="ytdwname" value="<%=user.getYtdwname() %& ...

  4. Problem 2285 迷宫寻宝

    http://acm.fzu.edu.cn/problem.php?pid=2285 Problem Description 洪尼玛今天准备去寻宝,在一个n*n (n行, n列)的迷宫中,存在着一个入 ...

  5. PAT L2-024 部落

    https://pintia.cn/problem-sets/994805046380707840/problems/994805056736444416 在一个社区里,每个人都有自己的小圈子,还可能 ...

  6. react render

    实际上react render方法返回一个虚拟dom 并没有去执行渲染dom 渲染的过程是交给react 去完成的 这就说明了为什么要在所有数据请求完成后才去实现render 这样做也提高了性能.只调 ...

  7. StatefulSet

    StatefulSet: 1.稳点且唯一的网络标识符 2.稳点且持久的存储 3.有序.平滑的部署和扩展 4.有序.平滑的删除和终止 5.有序的滚动更新 三个组件组成:headless(无头服务)    ...

  8. React Native & Google & Proxy

    React Native & Google & Proxy https://snack.expo.io/ https://expo.io/snacks/@xgqfrms https:/ ...

  9. easyui 自动动态合并单元格

    .......onLoadSuccess : function(data) { if (data.rows.length > 0) { //调用mergeCellsByField()合并单元格 ...

  10. group by具有去重的功能

    group by具有去重的功能