同余方程都不会写了。。还一直爆int

  1. /*
  2. 2.关于同余方程ax ≡b(mod p),可以用Exgcd做,但注意到p为质数,y一定有逆元
  3. 首先a%p=0时 仅当b=0时有解;然后有x ≡b*a^-1(mod p),a,p互质,可用快速幂求a的逆元,*b的得到x
  4. 但是扩欧还是比快速幂快的
  5. */
  6. #include<cmath>
  7. #include<cstdio>
  8. #include<cctype>
  9. #include<cstring>
  10. #define gc() (SS==TT&&(TT=(SS=IN)+fread(IN,1,MAXIN,stdin),SS==TT)?EOF:*SS++)
  11. typedef long long LL;
  12. const int MAXIN=1<<17,N=1e5,mod=5e6;
  13. char IN[MAXIN],*SS=IN,*TT=IN;
  14. struct HASH
  15. {
  16. int Enum,H[mod+3],nxt[N],to[N],val[N];
  17. void Init() {memset(H,0,sizeof H), Enum=0;}
  18. inline void AddEdge(int u,int v)
  19. {
  20. int x=u%mod;
  21. for(int i=H[x];i;i=nxt[i])
  22. if(val[i]==u) {to[i]=v; return;}
  23. to[++Enum]=v, val[Enum]=u, nxt[Enum]=H[x], H[x]=Enum;
  24. }
  25. int Query(int u)
  26. {
  27. int x=u%mod;
  28. for(int i=H[x];i;i=nxt[i])
  29. if(val[i]==u) return to[i];
  30. return -1;
  31. }
  32. }hs;
  33. inline int read()
  34. {
  35. int now=0,f=1;register char c=gc();
  36. for(;!isdigit(c);c=gc()) if(c=='-') f=-1;
  37. for(;isdigit(c);now=now*10+c-'0',c=gc());
  38. return now*f;
  39. }
  40. int Fast_Pow(LL a,int k,int p)
  41. {
  42. LL t=1;
  43. for(;k;k>>=1,a=a*a%p)
  44. if(k&1) t=t*a%p;
  45. return t;
  46. }
  47. int gcd(int a,int b)
  48. {
  49. return b?gcd(b,a%b):a;
  50. }
  51. void Exgcd(int a,int b,int &x,int &y)
  52. {
  53. if(!b) {x=1,y=0; return;}
  54. Exgcd(b,a%b,x,y);
  55. int t=x; x=y,y=t-a/b*y;
  56. }
  57. void Solve2(int a,int b,int p)//calc ax=b(mod p)->ax-py=b
  58. {
  59. int g=gcd(a,p);
  60. if(b%g) {puts("Orz, I cannot find x!"); return;}
  61. int x,y;
  62. Exgcd(a,p,x,y);//calc ax+by=gcd(a,b) or a/=g,b/=g,ax+by=1
  63. x=1LL*x*(b/g)%p;//ax*c/gcd+by*c/gcd=c*gcd/gcd=c
  64. p/=g;
  65. printf("%d\n",(x%p+p)%p);//x=x_0+k*p/g
  66. }
  67. void BSGS(int a,int b,int p)//a^x ≡b(mod p)
  68. {
  69. if(gcd(a,p)!=1) {puts("Orz, I cannot find x!"); return;}
  70. hs.Init();
  71. int m=ceil(sqrt(p-1));
  72. LL t=b%p,AM;
  73. for(int j=0;j<=m;++j) hs.AddEdge(t,j),t=t*a%p;
  74. AM=Fast_Pow(a,m,p),t=AM;
  75. for(int v,i=1;i<=m;++i,t=t*AM%p)
  76. if((v=hs.Query(t))!=-1) {printf("%d\n",(1LL*i*m-v)%p); return;}
  77. puts("Orz, I cannot find x!");
  78. }
  79. int main()
  80. {
  81. #ifndef ONLINE_JUDGE
  82. freopen("2242.in","r",stdin);
  83. #endif
  84. int t=read(),k=read(),a,b,p,x,y;
  85. while(t--)
  86. {
  87. a=read(),b=read(),p=read();
  88. if(k==1) printf("%d\n",Fast_Pow(a,b,p));
  89. else if(k==2) Solve2(a,b,p);
  90. else BSGS(a,b,p);
  91. }
  92. return 0;
  93. }

BZOJ.2242.[SDOI2011]计算器(扩展欧几里得 BSGS)的更多相关文章

  1. bzoj 2242: [SDOI2011]计算器【扩展欧几里得+快速幂+BSGS】

    第一问快速幂板子 第二问把式子转化为\( xy\equiv Z(mod P)\rightarrow xy+bP=z \),然后扩展欧几里得 第三问BSGS板子 #include<iostream ...

  2. 【bzoj2242】: [SDOI2011]计算器 数论-快速幂-扩展欧几里得-BSGS

    [bzoj2242]: [SDOI2011]计算器 1.快速幂 2.扩展欧几里得(费马小定理) 3.BSGS /* http://www.cnblogs.com/karl07/ */ #include ...

  3. bzoj 2242: [SDOI2011]计算器 BSGS+快速幂+扩展欧几里德

    2242: [SDOI2011]计算器 Time Limit: 10 Sec  Memory Limit: 512 MB[Submit][Status][Discuss] Description 你被 ...

  4. BZOJ 2242: [SDOI2011]计算器( 快速幂 + 扩展欧几里德 + BSGS )

    没什么好说的... --------------------------------------------------------------------- #include<cstdio&g ...

  5. BZOJ 2242: [SDOI2011]计算器 [快速幂 BSGS]

    2242: [SDOI2011]计算器 题意:求\(a^b \mod p,\ ax \equiv b \mod p,\ a^x \equiv b \mod p\),p是质数 这种裸题我竟然WA了好多次 ...

  6. BZOJ 1965 洗牌(扩展欧几里得)

    容易发现,对于牌堆里第x张牌,在一次洗牌后会变成2*x%(n+1)的位置. 于是问题就变成了求x*2^m%(n+1)=L,x在[1,n]范围内的解. 显然可以用扩展欧几里得求出. # include ...

  7. bzoj 2242 [SDOI2011]计算器(数论知识)

    Description 你被要求设计一个计算器完成以下三项任务: 1.给定y,z,p,计算Y^Z Mod P 的值: 2.给定y,z,p,计算满足xy≡ Z ( mod P )的最小非负整数: 3.给 ...

  8. bzoj 2242 [SDOI2011]计算器 快速幂+扩展欧几里得+BSGS

    1:快速幂  2:exgcd  3:exbsgs,题里说是素数,但我打的普通bsgs就wa,exbsgs就A了...... (map就是慢)..... #include<cstdio> # ...

  9. [原博客] BZOJ 2242 [SDOI2011] 计算器

    题目链接 noip级数论模版题了吧.让求三个东西: 给定y,z,p,计算`Y^Z Mod P` 的值. 给定y,z,p,计算满足`xy≡ Z ( mod P )`的最小非负整数. 给定y,z,p,计算 ...

随机推荐

  1. UML和模式应用5:细化阶段(4)--如何创建领域模型

    1.前言 以当前迭代中所要设计的需求为界,创建领域模型的步骤: 1.寻找概念类 2.将其绘制为UML类图中的类 3.添加关联和属性 2.如何寻找概念类 寻找概念类有如下几种方法: 重用和修改现有的模型 ...

  2. C++:vector的用法详解

    原文地址:http://blog.csdn.net/hancunai0017/article/details/7032383 vector(向量): C++中的一种数据结构,确切的说是一个类.它相当于 ...

  3. java linux ftp问题

    java写的ftp上传类,本地测试环境可以用,阿里云服务器不可用,两者系统均为centos.经过测试,发现appche的ftpclient类不可用,换成sun的ftpclient可以使用.

  4. Qt5.8 在windows下mingw静态编译

    官方对编译一些条件介绍:https://doc.qt.io/qt-5/windows-requirements.html 在默认情况下,用QtCreator编译程序时,使用的是动态编译.编译好的程序在 ...

  5. 通达OA数据库优化方案之_历史数据清理

    整体思路: 1.备份现有系统数据,提供一个可以查询历史的入口(可以查询2015年6月份以前的所有OA产生的流程) 2.删除生产环境中2015年6月份以前的流程 为避免影响考勤,暂定在本月考勤定稿后实施 ...

  6. 学习笔记(二)--->《Java 8编程官方参考教程(第9版).pdf》:第七章到九章学习笔记

    注:本文声明事项. 本博文整理者:刘军 本博文出自于: <Java8 编程官方参考教程>一书 声明:1:转载请标注出处.本文不得作为商业活动.若有违本之,则本人不负法律责任.违法者自负一切 ...

  7. 测试开发之Django——No5.Django项目的部署(CentOS7+nginx)

    配置环境:CentOS7 1.安装python3环境 默认的CentOS7系统中,会安装python2.7的版本,由于Django2.0并不支持python2.7的版本,所以我们需要自己在系统中安装p ...

  8. 并发之volatile关键字

    volatile关键字 volatile关键字是什么 在上一章我们讲到了并发的的三个概念,那么今天在讲解下在java中可以保证可见性和有序性的一个关键字. volatile关键字 :当变量的值被该关键 ...

  9. hdu5289 ST表+二分

    用裸的St表+暴力枚举查询时稳TLE的,可以枚举每个区间的起点+二分满足条件的区间右端,这样复杂度是O(nlogn) #include<iostream> #include<cstr ...

  10. 《剑指offer》-孩子们的游戏(圆圈中最后剩下的数)

    每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此.HF作为牛客的资深元老,自然也准备了一些小游戏.其中,有个游戏是这样的:首先,让小朋友们围成一个大圈.然后,他随机指定一个数m ...