博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
算法笔记--BSGS && exBSGS 模板
阅读量:5337 次
发布时间:2019-06-15

本文共 2613 字,大约阅读时间需要 8 分钟。

模板:

unordered_map
mp;LL q_pow(LL n, LL k, LL p) { LL ans = 1; if(k == -1) return 0; while(k) { if(k&1) ans = (ans*n) % p; n = (n*n) % p; k >>= 1; } return ans;}int BSGS(int a, int b, int p){ int m = sqrt(p)+1, s = b; mp.clear(); for(int i = 0; i < m; ++i){ mp[s]=i; s= (s*1LL*a)%p; } int t = q_pow(a, m, p); s = 1; for(int i = 1; i <= m; ++i){ s = (s*1LL*t)%p; if(mp.find(s) != mp.end()) return i*m-mp[s]; } return -1;}int exBSGS(int a, int b, int p) { int d = __gcd(a, p), k = 1, t = 0; while(d^1){ if(b%d) return -1; ++t; b /= d; p /= d; k = (k*1LL*(a/d)) % p; if(b == k) return t; d = __gcd(a, p); } int s = b; mp.clear(); int m = sqrt(p) + 1; for(int i = 0;i < m; ++i){ mp[s] = i; s = (s*1LL*a) % p; } s = k; k = q_pow(a, m, p); for(int i = 1; i <= m; ++i){ s = (s*1LL*k) % p; if(mp.find(s) != mp.end()) return i*m-mp[s]+t; } return -1;}

例题:

代码:

#pragma GCC optimize(2)#pragma GCC optimize(3)#pragma GCC optimize(4)#include
using namespace std;#define y1 y11#define fi first#define se second#define pi acos(-1.0)#define LL long long//#define mp make_pair#define pb push_back#define ls rt<<1, l, m#define rs rt<<1|1, m+1, r#define ULL unsigned LL#define pll pair
#define pli pair
#define pii pair
#define piii pair
#define pdd pair
#define mem(a, b) memset(a, b, sizeof(a))#define debug(x) cerr << #x << " = " << x << "\n";#define fio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);//headunordered_map
mp;LL q_pow(LL n, LL k, LL p) { LL ans = 1; if(k == -1) return 0; while(k) { if(k&1) ans = (ans*n) % p; n = (n*n) % p; k >>= 1; } return ans;}int exBSGS(int a, int b, int p) { int d = __gcd(a, p), k = 1, t = 0; while(d^1){ if(b%d) return -1; ++t; b /= d; p /= d; k = (k*1LL*(a/d)) % p; if(b == k) return t; d = __gcd(a, p); } int s = b; mp.clear(); int m = sqrt(p) + 1; for(int i = 0;i < m; ++i){ mp[s] = i; s = (s*1LL*a) % p; } s = k; k = q_pow(a, m, p); for(int i = 1; i <= m; ++i){ s = (s*1LL*k) % p; if(mp.find(s) != mp.end()) return i*m-mp[s]+t; } return -1;}int a, b, p;int main() { while(~scanf("%d %d %d", &a, &p, &b)) { if(!a && !b && !p) break; if(b == 1) { if(p == 1) printf("No Solution\n"); else printf("0\n"); } else { int x = exBSGS(a, b, p); if(~x) printf("%d\n", x); else printf("No Solution\n"); } } return 0;}

转载于:https://www.cnblogs.com/widsom/p/11269525.html

你可能感兴趣的文章
Ubuntu改坏sudoers后无法使用sudo的解决办法
查看>>
NEYC 2017 游记
查看>>
[搬运] 写给 C# 开发人员的函数式编程
查看>>
Python之旅Day14 JQuery部分
查看>>
core--线程池
查看>>
redux-effect
查看>>
Swift和OC混编
查看>>
Android轻量级的开源缓存框架ASimpleCache
查看>>
他山之石:加载图片的一个小问题
查看>>
shell - 常识
查看>>
mssql sqlserver 使用sql脚本 清空所有数据库表数据的方法分享
查看>>
分层图最短路【bzoj2763】: [JLOI2011]飞行路线
查看>>
linux下编译复数类型引发的错误:expected unqualified-id before '(' token
查看>>
codeforces 1041A Heist
查看>>
字典常用方法
查看>>
Spring Cloud Stream消费失败后的处理策略(三):使用DLQ队列(RabbitMQ)
查看>>
bzoj1048 [HAOI2007]分割矩阵
查看>>
Java中的编码
查看>>
PKUWC2018 5/6
查看>>
As-If-Serial 理解
查看>>