大步小步算法(BSGS)及扩展 & bzoj 2480
来源:互联网 发布:mac版qq无法接收文件 编辑:程序博客网 时间:2024/06/08 10:37
大步小步算法用于解决离散对数问题:
求满足
根据欧拉定理,
让我们运用meet-in-middle的思想。设
枚举
设表的插入和查询的时间复杂度分别是
使用哈希表,BSGS的时间复杂度是
以上通过设
如果
转化。
若
然而,也许
重复这个过程,最终得到
用上面的BSGS解决即可。其实这样复杂度已经非常玄学了……
如果某一步出现
一篇很好的文章,以上许多内容源自这里:扩展大步小步法解决离散对数问题
bzoj 2480。注意特判模1。
2016.3.29新加数据一组 by 1430586275
大概加的就是模1吧……包括上面那篇文章中的代码,网上不少题解现在都是无法AC的。
#include <cstdio>#include <cmath>#include <map>using namespace std;typedef long long ll;ll gcd(ll a, ll b){ return b ? gcd(b, a%b) : a;}inline ll fast_exp(ll x, ll n, ll p){ ll z = 1; for (ll y = x%p; n; y = y*y%p, n >>= 1) if (n & 1) z = z*y%p; return z;}ll extend_bsgs(ll a, ll y, ll p){ a %= p; y %= p; if (a == 0) return y > 1 ? -1 : y == 0 && p > 1; ll g, c = 0, q = 1; while ((g = gcd(a, p)) != 1) { if (y == 1) return c; if (y % g) return -1; ++c; y /= g; p /= g; q = a/g*q%p; } map<ll, ll> x; ll m = sqrt(p); for (ll i = 1, t = y*a%p; i <= m; ++i, t = t*a%p) x[t] = i; for (ll i = m, t = fast_exp(a, m, p); i-m < p-1; i += m) if (q = q*t%p, x.count(q)) return i-x[q]+c; return -1;}int main(){ ll a, p, b; while (scanf("%lld %lld %lld", &a, &p, &b), p) { ll ans = extend_bsgs(a, b, p); if (ans == -1) puts("No Solution"); else printf("%lld\n", ans); } return 0;}
- 大步小步算法(BSGS)及扩展 & bzoj 2480
- 大步小步算法 (BSGS算法)
- BZOJ 2480: Spoj3105 Mod【扩展大步小步
- BSGS算法学习小记(大步小步算法)
- Shank大步小步算法
- Poj2417 大步小步算法
- 浅谈大步小步算法
- (扩展)大步小步算法练习 bzoj3239;bzoj2480&bzoj1467
- hdu2815扩展小步大步攻击
- 【bzoj2480】Mod 扩展大步小步
- POJ 2417 大步小步算法
- POJ 3243 大步小步算法
- uva 11916 大步小步算法
- BSGS及扩展BSGS
- BZOJ 1467&&2480;3239 扩展BSGS
- 大步小步攻击算法_完全版
- uva 11916 - Emoogle Grid(大步小步算法)
- [省选前题目整理][SGU 261]Discrete Roots(扩展欧几里得+中国剩余定理+原根+大步小步算法)
- Android数据存储之SharedPreferences
- GDKOI2016
- angualr.js指令的详解
- TensorFlow学习(八):tensorborad可视化
- 刷杭电oj有感(1)。
- 大步小步算法(BSGS)及扩展 & bzoj 2480
- 【31.72%】【codeforces 604B】More Cowbell
- codeforces 742A-Arpa’s hard exam and Mehrdad’s naive cheat 快速幂
- 对Verilog 初学者比较有用的整理
- c语言如何生成随机数
- NOIP2016各省获奖名额及分数线
- 用循环模式打印菱形
- 如何在这操蛋的世界里保持快乐?
- Git-命令