1. Accepted 8508K 391MS C++ 2004B
  2. 相比下边,,优化太多太多了。。。
  3. /**
  4. baby-step-giant-step 因为数据量太大,,自己写hash
  5.  
  6. **/
  7. #include <iostream>
  8. #include <cstdio>
  9. #include <cmath>
  10. #include <cstring>
  11. using namespace std;
  12. long long n,a,b;
  13. const int maxn = ;
  14. bool Hash[maxn];
  15. long long idx[maxn];
  16. long long val[maxn];
  17.  
  18. void ex_gcd(long long a,long long b,long long &x,long long &y){
  19. if(b==){
  20. x=;
  21. y=;
  22. return ;
  23. }
  24. ex_gcd(b,a%b,x,y);
  25. long long tmp = x-(a/b)*y;
  26. x = y;
  27. y = tmp;
  28. }
  29.  
  30. long long euler(long long n){
  31. long long i,tmp = n;
  32. for(i=;i*i<=n;i++)if(n%i==){
  33. tmp = tmp/i*(i-);
  34. while(n%i==)
  35. n = n/i;
  36. }
  37. if(n>)
  38. tmp = tmp/n*(n-);
  39. return tmp;
  40. }
  41.  
  42. void Insert(long long id,long long num){
  43. long long k = num%maxn;
  44. while(Hash[k]&&val[k]!=num){
  45. k++;
  46. if(k==maxn) k = k-maxn;
  47. }
  48. if(!Hash[k]){
  49. Hash[k] =;
  50. idx[k] = id;
  51. val[k] = num;
  52. }
  53. }
  54.  
  55. long long found(long long num){
  56. long long k = num%maxn;
  57. while(Hash[k]&&val[k]!=num){
  58. k++;
  59. if(k==maxn) k = k-maxn;
  60. }
  61. if(!Hash[k]){
  62. return -;
  63. }
  64. return idx[k];
  65. }
  66.  
  67. long long baby_step(long long a,long long b,long long n){
  68. long long m = ceil(sqrt(euler(n)+0.5));
  69. memset(Hash,false,sizeof(Hash));
  70. memset(idx,-,sizeof(idx));
  71. memset(val,-,sizeof(val));
  72. long long d=;
  73. for(long long i=;i<m;i++){
  74. Insert(i,d);
  75. d = d*a%n;
  76. }
  77. long long res =;
  78. long long x,y;
  79. for(long long i=;i<m;i++){
  80. ex_gcd(res,n,x,y);
  81. long long tmp = x*b%n;
  82. tmp = (tmp%n+n)%n;
  83. long long k = found(tmp);
  84. if(k!=-){
  85. return (i)*m+k;
  86. }
  87. res = res*d%n;
  88. }
  89. return -;
  90. }
  91.  
  92. int main()
  93. {
  94. while(scanf("%I64d%I64d%I64d",&n,&a,&b)==){
  95. long long res = baby_step(a,b,n);
  96. if(res==-)
  97. printf("no solution\n");
  98. else
  99. printf("%I64d\n",res);
  100. }
  101. return ;
  102. }
  103.  
  104. -----------------------------------分割线---------------------------------------
  105. /**
  106. 106 高次方程。。。baby-step-giant-step 算法
  107. Accepted 4592K4 516MS C++1104B
  108. **/
  109. #include <iostream>
  110. #include <cstdio>
  111. #include <math.h>
  112. #include <map>
  113. using namespace std;
  114.  
  115. long long powmod(long long a,long long b,long long n){
  116. if(b==)
  117. return ;
  118. long long c =;
  119. while(b){
  120. if(b&)
  121. c =c*a%n;
  122. a =a*a%n;
  123. b>>=;
  124. }
  125. return c;
  126. }
  127.  
  128. long long logmod(long long a,long long b,long long n){
  129. long long m,v,e=,i;
  130. m = ceil(sqrt(n+0.5));
  131. //cout<<(double)(n-1)*1.0/m<<endl;
  132. //long long m_n = powmod(a,m,n);
  133. v = powmod(a,n--m,n);
  134. map<long long ,long long >x;
  135. x.clear();
  136. x[] =m;
  137. for(i=;i<m;i++){
  138. e = e*a%n;
  139. if(!x[e]) x[e]=i;
  140. }
  141. for(i=;i<m;i++){
  142. if(x[b]){
  143. long long num = x[b];
  144. x.clear();
  145. return i*m+(m==num?:num);
  146. }
  147. b = b*v%n;
  148. }
  149. return -;
  150. }
  151.  
  152. int main()
  153. {
  154. long long a,b,n;
  155. while(scanf("%I64d%I64d%I64d",&n,&a,&b)==){
  156. long long res = logmod(a,b,n);
  157. if(res==-)
  158. printf("no solution\n");
  159. else
  160. printf("%I64d\n",res);
  161. }
  162. return ;
  163. }

poj 2417的更多相关文章

  1. BSGS算法+逆元 POJ 2417 Discrete Logging

    POJ 2417 Discrete Logging Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 4860   Accept ...

  2. POJ - 2417 Discrete Logging(Baby-Step Giant-Step)

    d. 式子B^L=N(mod P),给出B.N.P,求最小的L. s.下面解法是设的im-j,而不是im+j. 设im+j的话,貌似要求逆元什么鬼 c. /* POJ 2417,3243 baby s ...

  3. POJ 2417 Discrete Logging 离散对数

    链接:http://poj.org/problem?id=2417 题意: 思路:求离散对数,Baby Step Giant Step算法基本应用. 下面转载自:AekdyCoin [普通Baby S ...

  4. poj 2417 Discrete Logging(A^x=B(mod c),普通baby_step)

    http://poj.org/problem?id=2417 A^x = B(mod C),已知A,B.C.求x. 这里C是素数,能够用普通的baby_step. 在寻找最小的x的过程中,将x设为i* ...

  5. POJ 2417 Discrete Logging BSGS

    http://poj.org/problem?id=2417 BSGS 大步小步法( baby step giant step ) sqrt( p )的复杂度求出 ( a^x ) % p = b % ...

  6. 【POJ 2417】 Discrete Logging

    [题目链接] http://poj.org/problem?id=2417 [算法] Baby-Step,Giant-Step算法 [代码] #include <algorithm> #i ...

  7. POJ 2417 Discrete Logging(离散对数-小步大步算法)

    Description Given a prime P, 2 <= P < 231, an integer B, 2 <= B < P, and an integer N, 1 ...

  8. POJ 2417 Discrete Logging

    http://www.cnblogs.com/jianglangcaijin/archive/2013/04/26/3045795.html 给p,a,b求a^n==b%p #include<a ...

  9. poj 2417 && poj3243(Baby-Step Giant-Step)

    Discrete Logging Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 4624   Accepted: 2113 ...

随机推荐

  1. Cocos2D-x权威指南:核心类成员CCNode

    节点类(CCNode)是Cocos2D-x中的主要类,继承自CCObject.继承关系如图3-2所看到的. 不论什么须要画在屏幕上的对象都是节点类. 最经常使用的节点类包含场景类(CCScene).布 ...

  2. Android Gson深入分析

    眼下解析json有三种工具:org.json(Java经常使用的解析),fastjson(阿里巴巴project师开发的).Gson(Google官网出的).解析速度最快的是Gson,下载地址:htt ...

  3. [转]PB 基本语句 循环语句

    PB 基本语句一.赋值语句赋值语句用于给变量.对象属性赋值,这是应用程序中使用最频繁的语句,其语法格式为:variablename = expression_r其中:⑴variablename是变量名 ...

  4. jQuery数据缓存data(name, value)详解及实现

    一. jQuery数据缓存的作用 jQuery数据缓存的作用在中文API中是这样描述的:“用于在一个元素上存取数据而避免了循环引用的风险”.如何理解这句话呢,看看我下面的举例,不知道合不合适,如果你有 ...

  5. vc6.0批量编译

    一直想研究一下怎么让电脑批处理编译程序,今天就从vc6开始,做个记录,学习一下. VC可以生成make文件(Project->Export Makefile),在设置好环境变量下,执行NMAKE ...

  6. Decorators and Wrappers in Python

    python代码一贯以优雅,简洁著称,而有时侯反而会让人难以理解,比如说wrapper(或者说decorator),这种方式提高了代码的可重用性,使用起来更简洁方便. 举个例子,比如WebApp常用的 ...

  7. 使用 http://httpbin.org/ 验证代理地址

    发现一个很方便的工具,在Linux 下使用  curl  http://httpbin.org/   可以返回当前使用的一些网络信息

  8. 搭建Ubuntu环境中的Error [dpkg 被中断,您必须手工运行 sudo dpkg --configure -a 解决此问题][安装Flashplayer出错 ]

    //解决方法如下: sudo rm /var/cache/apt/archives/lock sudo rm /var/lib/dpkg/lock sudo dpkg -r flashplugin-i ...

  9. MySQL 复制

    第一步:为配置主数据库与备数据库 主:server_id = 1      log_bin = E:\mysql_log_bin #复制事实上是二进制文件在备库上的重做,所以要支持二进制文件. 备: ...

  10. RedHat升级内核成功

    升级前 uname -aLinux localhost.localdomain 2.6.18-194.el5 #1 SMP Tue Mar 16 21:52:39 EDT 2010 x86_64 x8 ...