http://poj.org/problem?id=3243

  继续做一下BSGS的题,不过这题有点表述不清,我认为题目应该描述为XY mod Z ≡ K,因为的这题AC算法是不用判断余数是否大于模的。

  本来还想直接贴hdu那题的过去的,结果贴过去以后返回了wa,然后我就开始怀疑自己的BSGS写烂了,在hdu只是轻轻水过而已。于是,我就一个花了一个上午去debug这题,同时认真理解了一下BSGS算法的原理。对于前面一题消因子的方法,http://www.2cto.com/kf/201208/146200.html 这个博客的解释比较容易理解。然后,我就根据思路,仔细的检查了一下代码,同时把某些判断单独处理了。经过长时间的wa,我只好用别人的代码和自己的对拍了,结果发现一个十分可笑的差别,就是别人的代码少了判断余数是否大于等于模这一步,改了以后就AC了。。。。囧!

  我的BSGS是没问题的了,不过这种题见的也不多,所以比较难练啊。。。。- -

AC代码:

View Code

  1 #include <cstdio>
  2 #include <cstring>
  3 #include <cmath>
  4 #include <map>
  5 #include <algorithm>
  6
  7 using namespace std;
  8 typedef __int64 ll;
  9
 10 //map<int, int> EP;
 11
 12 const int maxn = 500007;
 13 int hash[maxn], EP[maxn];
 14
 15 bool insert(int x, int k){
 16     int p = (x << 6) % maxn;
 17
 18     if (p < 0) p += maxn;
 19     while (hash[p] != x && ~EP[p]) p = (p + 1) % maxn;
 20
 21     if (hash[p] == x && ~EP[p]) return false;
 22
 23     hash[p] = x;
 24     EP[p] = k;
 25
 26     return true;
 27 }
 28
 29 int find(int x){
 30     int p = (x << 6) % maxn;
 31
 32     if (p < 0) p += maxn;
 33     while (hash[p] != x && ~EP[p]) p = (p + 1) % maxn;
 34
 35     return EP[p];
 36 }
 37
 38 int gcd(int a, int b){
 39     return b ? gcd(b, a % b) : a;
 40 }
 41
 42 void exgcd(int a, int b, ll &x, ll &y){
 43     if (b){
 44         exgcd(b, a % b, y, x);
 45         y -= (a / b) * x;
 46     }
 47     else{
 48         x = 1;
 49         y = 0;
 50     }
 51 }
 52
 53 int multiMod(int a, int b, int m){
 54     int ret = 0;
 55
 56     while (b){
 57         if (b & 1) ret += a, ret %= m;
 58         a <<= 1;
 59         a %= m;
 60         b >>= 1;
 61     }
 62
 63     return ret;
 64 }
 65
 66 int powMod(int p, int n, int m){
 67     int ret = 1;
 68
 69     while (n){
 70         if (n & 1) ret = multiMod(ret, p, m);
 71         p = multiMod(p, p, m);
 72         n >>= 1;
 73     }
 74
 75     return ret;
 76 }
 77
 78 int babyStep(int &p, int &m, int &rest, int &base, int &mark){
 79     // return 0: cnt is answer
 80     // return -1: no solution
 81     // return else: base counts before steps, and mark is base-pow and return size
 82     int t, cur = 1 % m;
 83
 84     mark = 1 % m;
 85     base = 0;
 86 //    EP.clear();
 87     memset(EP, -1, sizeof(EP));
 88     while ((t = gcd(p, m)) != 1){
 89         if (rest % t) return -1;
 90         base++;
 91         m /= t;
 92         rest /= t;
 93         mark = multiMod(mark, p / t, m);
 94     }
 95
 96     int r = (int) ceil(sqrt((double) m));
 97
 98     cur = 1 % m;
 99     for (int i = 0; i <= r; i++){
100 //        if (EP.count(cur)) break;
101 //        EP[cur] = i;
102         if (!insert(cur, i)) break;
103         cur = multiMod(cur, p, m);
104     }
105
106     return r;
107 }
108
109 int giantStep(int p, int m, int rest){
110     //if (rest >= m) return -1;
111
112     rest %= m;
113     for (int i = 0, cur = 1 % m; i <= 50; i++){ // before baby-step try whether there is a simple solution
114         if (cur == rest){
115             return i;
116         }
117         cur = multiMod(cur, p, m);
118     }
119
120     int tmp, cnt;
121     int r = babyStep(p, m, rest, cnt, tmp);
122
123     if (r == -1) return -1;
124
125     int ep = powMod(p, r, m); // cycle-length
126
127     if (!r)    return cnt;
128     for (int i = 0; i <= r; i++){
129         ll x, y;
130
131         exgcd(tmp, m, x, y);
132         x = multiMod(x, rest, m);
133         if (x < 0) x += m;
134 //        if (EP.count((int)x)){
135 //            return EP[(int)x] + i * r + cnt;
136 //        }
137         int f = find((int)x);
138
139         if (~f) return f + i * r + cnt;
140         tmp = multiMod(tmp, ep, m);
141     }
142
143     return -1;
144 }
145
146 int main(){
147     int k, p, n;
148
149     while (~scanf("%d%d%d", &k, &p, &n) && (k || p || n)){
150         int ans = giantStep(k, p, n);
151
152         if (~ans && ans < p) printf("%d\n", ans);
153         else puts("No Solution");
154     }
155
156     return 0;
157 }

——written by Lyon

转载于:https://www.cnblogs.com/LyonLys/archive/2012/09/19/poj_3243_Lyon.html

poj 3243 Clever Y(Baby-Step Giant-Step)相关推荐

  1. poj 3243 Clever Y

    转载请注明出处,谢谢http://blog.csdn.net/bigtiao097?viewmode=contents 题意: 给定A.B.C,求 Ax≡B(modC) A^x \equiv B( m ...

  2. NOI数学:大步小步(Baby Step Giant Step,BSGS)算法

    BSGS算法求 高次同余方程:1.可爱的质数 2.计算器 BSGS算法求 高次同余方程:1.可爱的质数 2.计算器_啦啦啦32421的博客-CSDN博客 大步小步算法(BSGS)及扩展 & b ...

  3. 离散对数(Baby Step Giant Step)

    现在我来介绍一种算法叫做Baby Step Giant Step.它是用来解决如下方程最小正整数解的     其中 如果,那么我们可以先取模,即,所以在这里我们只讨论的情况. 普通Baby Step ...

  4. BZOJ 2242([SDOI2011]计算器-Baby Step Giant Step第1题)

    2242: [SDOI2011]计算器 Time Limit: 10 Sec  Memory Limit: 512 MB Submit: 744  Solved: 289 [Submit][Statu ...

  5. 【数学】Baby Step,Giant Step

    给定整数 a,b,pa,b,pa,b,p 且 a,pa,pa,p 互质,请求出高次同余方程 ax≡b(modp)a^x\equiv b\pmod pax≡b(modp) 的非负整数解. 首先, a0≡ ...

  6. luogu2485 [SDOI2011]计算器 poj3243 Clever Y BSGS算法

    BSGS 算法,即 Baby Step,Giant Step 算法.拔山盖世算法. 计算 \(a^x \equiv b \pmod p\). \(p\)为质数时 特判掉 \(a,p\) 不互质的情况. ...

  7. C#2.0实例程序STEP BY STEP--实例二:数据类型

    C#2.0实例程序STEP BY STEP--实例二:数据类型 与其他.NET语言一样,C#支持Common Type Sysem(CTS),其中的数据类型集合不仅包含我们熟悉的基本类型,例如int, ...

  8. am335x linux内核烧写_实时 Linux 抖动分析 Step by step

    本文首次发表于 实时 Linux 抖动分析 Step by step 前段时间有同学问到: 大家有显卡方面实时性调优经验交流吗?我现在是 x86,不加显示任务实时性可以保持在 20us 内,如果加上显 ...

  9. SECRET SHARING STEP BY STEP

    In this blog article I will show the different types of secret sharing methods especially the common ...

最新文章

  1. VC知识点:关于没有提示的内存泄露
  2. slab 内存分配器介绍(一)
  3. Nginx(四):Nginx配置实战
  4. 无线传感器在智能家居中的应用
  5. Wannafly挑战赛23 A 字符串
  6. python的requests库
  7. bzoj1047 [HAOI2007]理想的正方形 单调队列
  8. 为什么oracle的环境这么复杂_(草稿)兽医执业环境为什么如此复杂?这次我们谈谈需求...
  9. 安装DevExpress QuantumGrid 4.5组件出现问题,急!!
  10. Android Multimedia框架总结(九)Stagefright框架之数据处理及到OMXCodec过程
  11. 怎么判断间隙过渡过盈配合_什么是间隙配合、过盈配合、过渡配合?它们在汽车上有哪些应用?...
  12. sql常用语句之DDL
  13. Mac电脑常用软件安装
  14. 高通高级技术标准总监李俨:C-V2X助力自动驾驶的招式和心法
  15. 百度AI市场热品试用 | 迪威泰超薄双目摄像机模组
  16. matlab 数字和字符串转换
  17. 为skynet的crypt库扩展一些加密(摘要)算法支持
  18. 微信公众号开发——基础认识
  19. Enable VT-x in your BIOS security settings, ensure that HAXM is installed properly
  20. 前端 各种API网站,教程网站,素材网站,工具网站,非常好用

热门文章

  1. 16年的大数据经验,为了搞定数字化转型,我和老板做了个赌注
  2. 让领导狂夸,让业务目瞪口呆的报表,竟然是这样?
  3. 一个500强公司的数据化运营管理实践
  4. 解决flex打包成exe之后不能升级的问题
  5. 轻量化网络:SqueezeNet
  6. pytorch学习笔记(三十七):RMSProp
  7. Python中索引的学习笔记
  8. pandas 多线程处理数据框
  9. python 中__init__ 与 __call__ 的区别
  10. 如何在Spyder中使用远程服务器的python来调试代码