poj 3243 Clever Y(Baby-Step Giant-Step)
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代码:
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)相关推荐
- poj 3243 Clever Y
转载请注明出处,谢谢http://blog.csdn.net/bigtiao097?viewmode=contents 题意: 给定A.B.C,求 Ax≡B(modC) A^x \equiv B( m ...
- NOI数学:大步小步(Baby Step Giant Step,BSGS)算法
BSGS算法求 高次同余方程:1.可爱的质数 2.计算器 BSGS算法求 高次同余方程:1.可爱的质数 2.计算器_啦啦啦32421的博客-CSDN博客 大步小步算法(BSGS)及扩展 & b ...
- 离散对数(Baby Step Giant Step)
现在我来介绍一种算法叫做Baby Step Giant Step.它是用来解决如下方程最小正整数解的 其中 如果,那么我们可以先取模,即,所以在这里我们只讨论的情况. 普通Baby Step ...
- BZOJ 2242([SDOI2011]计算器-Baby Step Giant Step第1题)
2242: [SDOI2011]计算器 Time Limit: 10 Sec Memory Limit: 512 MB Submit: 744 Solved: 289 [Submit][Statu ...
- 【数学】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≡ ...
- luogu2485 [SDOI2011]计算器 poj3243 Clever Y BSGS算法
BSGS 算法,即 Baby Step,Giant Step 算法.拔山盖世算法. 计算 \(a^x \equiv b \pmod p\). \(p\)为质数时 特判掉 \(a,p\) 不互质的情况. ...
- C#2.0实例程序STEP BY STEP--实例二:数据类型
C#2.0实例程序STEP BY STEP--实例二:数据类型 与其他.NET语言一样,C#支持Common Type Sysem(CTS),其中的数据类型集合不仅包含我们熟悉的基本类型,例如int, ...
- am335x linux内核烧写_实时 Linux 抖动分析 Step by step
本文首次发表于 实时 Linux 抖动分析 Step by step 前段时间有同学问到: 大家有显卡方面实时性调优经验交流吗?我现在是 x86,不加显示任务实时性可以保持在 20us 内,如果加上显 ...
- SECRET SHARING STEP BY STEP
In this blog article I will show the different types of secret sharing methods especially the common ...
最新文章
- VC知识点:关于没有提示的内存泄露
- slab 内存分配器介绍(一)
- Nginx(四):Nginx配置实战
- 无线传感器在智能家居中的应用
- Wannafly挑战赛23 A	字符串
- python的requests库
- bzoj1047 [HAOI2007]理想的正方形 单调队列
- 为什么oracle的环境这么复杂_(草稿)兽医执业环境为什么如此复杂?这次我们谈谈需求...
- 安装DevExpress QuantumGrid 4.5组件出现问题,急!!
- Android Multimedia框架总结(九)Stagefright框架之数据处理及到OMXCodec过程
- 怎么判断间隙过渡过盈配合_什么是间隙配合、过盈配合、过渡配合?它们在汽车上有哪些应用?...
- sql常用语句之DDL
- Mac电脑常用软件安装
- 高通高级技术标准总监李俨:C-V2X助力自动驾驶的招式和心法
- 百度AI市场热品试用 | 迪威泰超薄双目摄像机模组
- matlab 数字和字符串转换
- 为skynet的crypt库扩展一些加密(摘要)算法支持
- 微信公众号开发——基础认识
- Enable VT-x in your BIOS security settings, ensure that HAXM is installed properly
- 前端 各种API网站,教程网站,素材网站,工具网站,非常好用