题目大意就是求 a^x = b(mod c) 中的x

用一般的baby step giant step 算法会超时

这里参考的是http://hi.baidu.com/aekdycoin/item/236937318413c680c2cf29d4

map平衡树查找值

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <iostream>
  4. #include <cmath>
  5. #include <map>
  6. using namespace std;
  7. #define ll long long
  8.  
  9. int q_pow(int a , int b , int mod)
  10. {
  11. ll ans = ;
  12. while(b)
  13. {
  14. if(b&) ans =((ll)ans*a)%mod;
  15. a = ((ll)a*a)%mod;
  16. b>>=;
  17. }
  18. return ans;
  19. }
  20.  
  21. int gcd(int a , int b)
  22. {
  23. if(b == )return a;
  24. else return gcd(b,a%b);
  25. }
  26.  
  27. int ex_gcd(int a , int &x , int b , int &y)
  28. {
  29. if(b == ){
  30. x= , y=;
  31. return a;
  32. }
  33. int ans = ex_gcd(b , x , a%b , y);
  34. int t = x;
  35. x=y , y = t-a/b*y;
  36. return ans;
  37. }
  38.  
  39. int inv(int a , int b , int mod)
  40. {
  41. int x , y , d;
  42. d = ex_gcd(a , x , mod , y);
  43. int e = (ll)x*b%mod;
  44. return e<?e+mod:e;
  45. }
  46.  
  47. int BabyStep(int A,int B,int C){
  48. map<int,int> Hash;
  49. ll buf=%C,D=buf,K;
  50. int i,d=,tmp;
  51. for(i=;i<=;buf=buf*A%C,++i)
  52. if(buf==B) return i;
  53. while((tmp=gcd(A,C))!=)
  54. {
  55. if(B%tmp)return -;
  56. ++d;
  57. C/=tmp;
  58. B/=tmp;
  59. D=D*A/tmp%C;
  60. }
  61. Hash.clear();
  62. int M=(int)ceil(sqrt((double)C));
  63. for(buf=%C,i=;i<=M;buf=buf*A%C,++i)
  64. if(!Hash.count((int)buf))Hash[(int)buf]=i;
  65. for(i=,K=q_pow((ll)A,M,C);i<=M;D=D*K%C,++i)
  66. {
  67. tmp=inv(D,B,C);
  68. if(tmp>=&&Hash.count(tmp))return i*M+Hash[tmp]+d;
  69. }
  70. return -;
  71. }
  72. int main()
  73. {
  74. // freopen("a.in" ,"r" , stdin);
  75. int k , p , n;
  76. while(scanf("%d%d%d" , &k , &p , &n) == )
  77. {
  78. if(n>=p){
  79. puts("Orz,I can’t find D!");
  80. continue;
  81. }
  82. int ans = BabyStep(k , n , p);
  83. if(ans == -) puts("Orz,I can’t find D!");
  84. else printf("%d\n" , ans);
  85. }
  86. return ;
  87. }

hash表查找值(效率高很多)hash是线性查找:

  1. #include<iostream>
  2. #include<map>
  3. #include<cmath>
  4. #include <cstdio>
  5. using namespace std;
  6. typedef long long LL;
  7. const int maxn = ;
  8. struct hash{
  9. int a,b,next;
  10. }Hash[maxn << ];
  11. int flg[maxn + ];
  12. int top,idx;
  13. //hash值插入
  14. void ins(int a,int b){
  15. int k = b & maxn;
  16. if(flg[k] != idx){
  17. flg[k] = idx;
  18. Hash[k].next = -;
  19. Hash[k].a = a;
  20. Hash[k].b = b;
  21. return ;
  22. }
  23. while(Hash[k].next != -){
  24. if(Hash[k].b == b) return ;
  25. k = Hash[k].next;
  26. }
  27. Hash[k].next = ++ top;
  28. Hash[top].next = -;
  29. Hash[top].a = a;
  30. Hash[top].b = b;
  31. }
  32. //hash值查找
  33. int find(int b){
  34. int k = b & maxn;
  35. if(flg[k] != idx) return -;
  36. while(k != -){
  37. if(Hash[k].b == b) return Hash[k].a;
  38. k = Hash[k].next;
  39. }
  40. return -;
  41. }
  42. int gcd(int a,int b)
  43. {
  44. return b?gcd(b,a%b):a;
  45. }
  46. int ext_gcd(int a,int b,int& x,int& y)
  47. {
  48. int t,ret;
  49. if (!b){x=,y=;return a;}
  50. ret=ext_gcd(b,a%b,x,y);
  51. t=x,x=y,y=t-a/b*y;
  52. return ret;
  53. }
  54. int Inval(int a,int b,int n){
  55. int x,y,e;
  56. ext_gcd(a,n,x,y);
  57. e=(LL)x*b%n;
  58. return e<?e+n:e;
  59. }
  60. int pow_mod(LL a,int b,int c)
  61. {
  62. LL ret=%c;
  63. a%=c;
  64. while(b){
  65. if(b&)ret=ret*a%c;
  66. a=a*a%c;
  67. b>>=;
  68. }
  69. return ret;
  70. }
  71. int BabyStep(int A,int B,int C){
  72. top = maxn; ++ idx;
  73. LL buf=%C,D=buf,K;
  74. int i,d=,tmp;
  75. for(i=;i<=;buf=buf*A%C,++i)
  76. if(buf==B)return i;
  77. while((tmp=gcd(A,C))!=){
  78. if(B%tmp)return -;
  79. ++d;
  80. C/=tmp;
  81. B/=tmp;
  82. D=D*A/tmp%C;
  83. }
  84. int M=(int)ceil(sqrt(C+0.5));
  85. for(buf=%C,i=;i<=M;buf=buf*A%C,++i)
  86. ins(i,buf);
  87. for(i=,K=pow_mod((LL)A,M,C);i<=M;D=D*K%C,++i){
  88. tmp=Inval((int)D,B,C);
  89. int w ;
  90. if(tmp>=&&(w = find(tmp)) != -) return i*M+w+d;
  91. }
  92. return -;
  93. }
  94. int main(){
  95. int A,B,C;
  96. while(scanf("%d%d%d",&A,&C,&B)!=EOF){
  97. if(B>C){
  98. puts("Orz,I can’t find D!");
  99. continue;
  100. }
  101. int tmp=BabyStep(A,B,C);
  102. if(tmp<)
  103. puts("Orz,I can’t find D!");
  104. else printf("%d\n",tmp);
  105. }
  106. return ;
  107. }

HDU 2815 扩展baby step giant step 算法的更多相关文章

  1. HDU 2815 Mod Tree 离散对数 扩张Baby Step Giant Step算法

    联系:http://acm.hdu.edu.cn/showproblem.php?pid=2815 意甲冠军: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQ ...

  2. 【学习笔记】Baby Step Giant Step算法及其扩展

    1. 引入 Baby Step Giant Step算法(简称BSGS),用于求解形如\(a^x\equiv b\pmod p\)(\(a,b,p\in \mathbb{N}\))的同余方程,即著名的 ...

  3. 解高次同余方程 (A^x=B(mod C),0<=x<C)Baby Step Giant Step算法

    先给出我所参考的两个链接: http://hi.baidu.com/aekdycoin/item/236937318413c680c2cf29d4 (AC神,数论帝  扩展Baby Step Gian ...

  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. 『高次同余方程 Baby Step Giant Step算法』

    高次同余方程 一般来说,高次同余方程分\(a^x \equiv b(mod\ p)\)和\(x^a \equiv b(mod\ p)\)两种,其中后者的难度较大,本片博客仅将介绍第一类方程的解决方法. ...

  6. [置顶] hdu2815 扩展Baby step,Giant step入门

    题意:求满足a^x=b(mod n)的最小的整数x. 分析:很多地方写到n是素数的时候可以用Baby step,Giant step, 其实研究过Baby step,Giant step算法以后,你会 ...

  7. 数论之高次同余方程(Baby Step Giant Step + 拓展BSGS)

    什么叫高次同余方程?说白了就是解决这样一个问题: A^x=B(mod C),求最小的x值. baby step giant step算法 题目条件:C是素数(事实上,A与C互质就可以.为什么?在BSG ...

  8. POJ 2417 Discrete Logging ( Baby step giant step )

    Discrete Logging Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 3696   Accepted: 1727 ...

  9. 【POJ2417】baby step giant step

    最近在学习数论,然而发现之前学的baby step giant step又忘了,于是去翻了翻以前的代码,又复习了一下. 觉得总是忘记是因为没有彻底理解啊. 注意baby step giant step ...

随机推荐

  1. Miller&&Pollard HDOJ 4344 Mark the Rope

    题目传送门 题意:一个长为n(n<2^63)的管子,在管子上做标记,每隔L个长度单位做一个标记,从管子头端开始,保证最后一次标记恰好在管子的尾端.让你找出有多少个这样的L(L<n),且他们 ...

  2. synchronized(2)修饰方法之:普通方法

    synchronized方法 [同一个对象的该方法一次只有一个线程可以访问,该对象的其它同步方法也被阻塞] 方法声明时使用,放在范围操作符(public等)之后,返回类型声明(void等)之前.这时, ...

  3. js类、原型——学习笔记

    js 内置有很多类,我们用的,都是从这些类实例化出来的. function Object () {} function Array () {} function String () {} functi ...

  4. AJPFX解析Java关键字之assert

    Java有许多关键字,但是这个关键字估计很少有人了解,今天就跟大家谈一谈这个关键字吧. 先说明一下,这个关键字开发中用的极少,感兴趣的朋友可以了解一下. 一.概述 在C和C++语言中都有assert关 ...

  5. struts2 源码地址

    http://archive.apache.org/dist/struts/

  6. iOS之NSAttributedString-------字符属性

    NSAttributedString 字符属性 字符属性可以应用于 attributed string 的文本中. NSString *const NSFontAttributeName;(字体) N ...

  7. table鼠标滑过变颜色

    table鼠标滑过变颜色 添加 table tr:hover{background-color: #eee;} 设置鼠标滑过行背景变色,重新刷新浏览器页面.  一般设置灰色,eee

  8. C#运用存储过程新增一条记录并返回自动生成的ID

    @Hcy黄灿奕:http://blog.sina.com.cn/iihcy 前言: 1.存储过的好处: 存储过程相对于其他的数据库访问方法有以下的优点: (1)重复使用.存储过程可以重复使用,从而可以 ...

  9. HTML a标签的href 属性 tel 点击可以直接拨打电话 ( 移动端 )

    <a href="tel:13828172679">13622178579</a>

  10. 通过 GCC 学习 OpenMP 框架

     OpenMP 框架是使用 C.C++ 和 Fortran 进行并发编程的一种强大方法.GNU Compiler Collection (GCC) V4.4.7 支持 OpenMP 3.0 标准,而 ...