扩展BSGS的板子

对于gcd(a,p)>1的情况

即扩展BSGS

把式子变成等式的形式: \( a^x+yp=b \)

设 \( g=gcd(a,p) \)

那么两边同时除以g就会变成: \( \frac{a}{g} a^{x-1}+y\frac{p}{g}=\frac{b}{g} \)

如此循环到ap互质,然后正常BSGS求即可

最后答案加上循环次数,即当前的x是经过几次减一得到的

注意有很多关于0和1的特判

以及这道题在bzoj上是可以用map的,但是poj上只能用hash

map版:

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<map>
  4. #include<cmath>
  5. using namespace std;
  6. int a,b,p,ans;
  7. map<int,int>mp;
  8. int gcd(int a,int b)
  9. {
  10. return b==0?a:gcd(b,a%b);
  11. }
  12. int ksm(int a,int b,int p)
  13. {
  14. int r=1;
  15. while(b)
  16. {
  17. if(b&1)
  18. r=(long long)r*a%p;
  19. a=(long long)a*a%p;
  20. b>>=1;
  21. }
  22. return r;
  23. }
  24. int BSGS(int a,int b,int p)
  25. {
  26. a%=p,b%=p;
  27. if(b==1)
  28. return 0;
  29. int cnt=0,d=1;
  30. for(int g=gcd(a,p);g!=1;g=gcd(a,p))
  31. {
  32. if(b%g)
  33. return -1;
  34. p/=g,b/=g;
  35. d=(long long)d*a/g%p;
  36. cnt++;
  37. if(b==d)
  38. return cnt;
  39. }
  40. mp.clear();
  41. int m=ceil(sqrt(p)),t=b;
  42. for(int i=0;i<m;i++)
  43. {
  44. mp[t]=i;
  45. t=(long long)t*a%p;
  46. }
  47. int g=ksm(a,m,p);
  48. t=(long long)d*g%p;
  49. for(int i=1;i<=m+1;i++)
  50. {
  51. if(mp[t])
  52. return cnt+i*m-mp[t];
  53. t=(long long)t*g%p;
  54. }
  55. return -1;
  56. }
  57. int main()
  58. {
  59. while(scanf("%d%d%d",&a,&p,&b)&&a+b+p)
  60. {
  61. if(p==1)
  62. {
  63. puts("0");
  64. continue;
  65. }
  66. ans=BSGS(a,b,p);
  67. if(ans==-1)
  68. puts("No Solution");
  69. else
  70. printf("%d\n",ans);
  71. }
  72. return 0;
  73. }

hash版,大概比map快三到四倍

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cmath>
  4. #include<cstring>
  5. using namespace std;
  6. const int mod=739391,N=2e6;
  7. int a,b,p,ans,ti,v[N],con;
  8. struct qwe
  9. {
  10. int b,v,ne;
  11. }ha[N];
  12. void ins(int w,int b,int va)
  13. {//cout<<va<<endl;
  14. if(v[w]!=ti)
  15. {
  16. v[w]=ti;
  17. ha[w].v=va;
  18. ha[w].b=b;
  19. ha[w].ne=-1;
  20. return;
  21. }
  22. for(;ha[w].ne!=-1;w=ha[w].ne)
  23. if(ha[w].b==b)
  24. return;
  25. ha[w].ne=++con;
  26. ha[con].ne=-1;
  27. ha[con].v=va;
  28. ha[con].b=b;
  29. }
  30. int find(int w,int b)
  31. {
  32. if(v[w]!=ti)
  33. return 0;
  34. for(;w!=-1;w=ha[w].ne)
  35. if(ha[w].b==b)
  36. return ha[w].v;
  37. return 0;
  38. }
  39. int gcd(int a,int b)
  40. {
  41. return b==0?a:gcd(b,a%b);
  42. }
  43. int ksm(int a,int b,int p)
  44. {
  45. int r=1;
  46. while(b)
  47. {
  48. if(b&1)
  49. r=(long long)r*a%p;
  50. a=(long long)a*a%p;
  51. b>>=1;
  52. }
  53. return r;
  54. }
  55. int BSGS(int a,int b,int p)
  56. {
  57. a%=p,b%=p;
  58. if(b==1)
  59. return 0;
  60. int cnt=0,d=1;
  61. for(int g=gcd(a,p);g!=1;g=gcd(a,p))
  62. {
  63. if(b%g)
  64. return -1;
  65. p/=g,b/=g;
  66. d=(long long)d*a/g%p;
  67. cnt++;
  68. if(b==d)
  69. return cnt;
  70. }
  71. con=mod,ti++;
  72. int m=ceil(sqrt(p)),t=b;
  73. for(int i=0;i<m;i++)
  74. {
  75. ins(t%mod,t,i);
  76. t=(long long)t*a%p;
  77. }
  78. int g=ksm(a,m,p),now;
  79. t=(long long)d*g%p;
  80. for(int i=1;i<=m+1;i++)
  81. {
  82. if(now=find(t%mod,t))
  83. return cnt+i*m-now;
  84. t=(long long)t*g%p;
  85. }
  86. return -1;
  87. }
  88. int main()
  89. {
  90. while(scanf("%d%d%d",&a,&p,&b)&&a+b+p)
  91. {
  92. if(p==1)
  93. {
  94. puts("0");
  95. continue;
  96. }
  97. ans=BSGS(a,b,p);
  98. if(ans==-1)
  99. puts("No Solution");
  100. else
  101. printf("%d\n",ans);
  102. }
  103. return 0;
  104. }

poj 3243 Clever Y && 1467: Pku3243 clever Y【扩展BSGS】的更多相关文章

  1. bzoj 1467: Pku3243 clever Y 扩展BSGS

    1467: Pku3243 clever Y Time Limit: 4 Sec  Memory Limit: 64 MB[Submit][Status][Discuss] Description 小 ...

  2. bzoj1467 Pku3243 clever Y

    1467: Pku3243 clever Y Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 313  Solved: 181[Submit][Status ...

  3. 【EX_BSGS】BZOJ1467 Pku3243 clever Y

    1467: Pku3243 clever Y Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 425  Solved: 238[Submit][Status ...

  4. POJ 3243 Clever Y (求解高次同余方程A^x=B(mod C) Baby Step Giant Step算法)

    不理解Baby Step Giant Step算法,请戳: http://www.cnblogs.com/chenxiwenruo/p/3554885.html #include <iostre ...

  5. POJ 3243 Clever Y 扩展BSGS

    http://poj.org/problem?id=3243 这道题的输入数据输入后需要将a和b都%p https://blog.csdn.net/zzkksunboy/article/details ...

  6. 【POJ 3243】Clever Y 拓展BSGS

    调了一周,我真制杖,,, 各种初始化没有设为1,,,我当时到底在想什么??? 拓展BSGS,这是zky学长讲课的课件截屏: 是不是简单易懂.PS:聪哥说“拓展BSGS是偏题,省选不会考,信我没错”,那 ...

  7. POJ 3243 Clever Y(离散对数-拓展小步大步算法)

    Description Little Y finds there is a very interesting formula in mathematics: XY mod Z = K Given X, ...

  8. poj 3243 Clever Y 高次方程

    1 Accepted 8508K 579MS C++ 2237B/** hash的强大,,还是高次方程,不过要求n不一定是素数 **/ #include <iostream> #inclu ...

  9. [POJ 3243]Clever Y

    Description Little Y finds there is a very interesting formula in mathematics: XY mod Z = K Given X, ...

随机推荐

  1. HDU3549 最大流 裸题

    EK算法 时间复杂度o(n*m*m)  因为有反向边每次bfs时间为 n*m 每次删一条边 最多m次 代码 #include<iostream> #include<string.h& ...

  2. Python从文件中读取字符串,用正则表达式匹配中文字符的问题

    2013-07-27 21:01:37|           在Windows下,用Python从.txt文件中读取字符串,并用正则表达式匹配中文,在网上看了方法,用的时候发现中文没有被匹配.     ...

  3. C. Nearest vectors--cf598C(极角排序)

    http://codeforces.com/problemset/problem/598/C 题目大意: 给你你个向量  向量的起点都是从(0,0)开始的   求哪个角最小  输出这两个向量 这是第一 ...

  4. 大数c++模板 超级好用

    只用输入用cin 输出  cout  每个数学符号都可以用   超级强大 #include <iostream> #include <queue> #include <c ...

  5. 通过socket过去本地ip,port和远端ip,port

    struct sockaddr addr;struct sockaddr_in* addr_v4;int addr_len = sizeof(addr); //获取local ip and portZ ...

  6. how to read openstack code: action extension

    之前我们看过了core plugin, service plugin 还有resource extension. resource extension的作用是定义新的资源.而我们说过还有两种exten ...

  7. HDU 4279 Number(找规律)

    Number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Sub ...

  8. USACO castle

    <pre name="code" class="cpp"><pre>USER: Kevin Samuel [kevin_s1] TASK ...

  9. STL源代码剖析——STL算法之set集合算法

    前言 本节介绍set集合的相关算法,各自是并集set_union,差集set_difference,交集set_intersection 和对称差集set_symmetric_difference.这 ...

  10. Nyquist–Shannon sampling theorem 采样定理

    Nyquist–Shannon sampling theorem - Wikipedia https://en.wikipedia.org/wiki/Nyquist%E2%80%93Shannon_s ...