https://www.cnblogs.com/sdzwyq/p/9900650.html

模板:

unordered_map<int, int> 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;
}

例题:P4195 【模板】exBSGS/Spoj3105 Mod

代码:

#pragma GCC optimize(2)
#pragma GCC optimize(3)
#pragma GCC optimize(4)
#include<bits/stdc++.h>
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<LL, LL>
#define pli pair<LL, int>
#define pii pair<int, int>
#define piii pair<pii, int>
#define pdd pair<double, double>
#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);
//head unordered_map<int, int> 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;
}

算法笔记--BSGS && exBSGS 模板的更多相关文章

  1. 算法笔记--sg函数详解及其模板

    算法笔记 参考资料:https://wenku.baidu.com/view/25540742a8956bec0975e3a8.html sg函数大神详解:http://blog.csdn.net/l ...

  2. opencv笔记4:模板运算和常见滤波操作

    time:2015年10月04日 星期日 00时00分27秒 # opencv笔记4:模板运算和常见滤波操作 这一篇主要是学习模板运算,了解各种模板运算的运算过程和分类,理论方面主要参考<图像工 ...

  3. BSGS&EXBSGS 大手拉小手,大步小步走

    大步小步走算法处理这样的问题: A^x = B (mod C) 求满足条件的最小的x(可能无解) 其中,A/B/C都可以是很大的数(long long以内) 先分类考虑一下: 当(A,C)==1 即A ...

  4. 算法笔记--数位dp

    算法笔记 这个博客写的不错:http://blog.csdn.net/wust_zzwh/article/details/52100392 数位dp的精髓是不同情况下sta变量的设置. 模板: ]; ...

  5. 算法笔记--lca倍增算法

    算法笔记 模板: vector<int>g[N]; vector<int>edge[N]; ][N]; int deep[N]; int h[N]; void dfs(int ...

  6. [置顶] 小白学习KM算法详细总结--附上模板题hdu2255

    KM算法是基于匈牙利算法求最大或最小权值的完备匹配 关于KM不知道看了多久,每次都不能完全理解,今天花了很久的时间做个总结,归纳以及结合别人的总结给出自己的理解,希望自己以后来看能一目了然,也希望对刚 ...

  7. 学习Java 以及对几大基本排序算法(对算法笔记书的研究)的一些学习总结(Java对算法的实现持续更新中)

    Java排序一,冒泡排序! 刚刚开始学习Java,但是比较有兴趣研究算法.最近看了一本算法笔记,刚开始只是打算随便看看,但是发现这本书非常不错,尤其是对排序算法,以及哈希函数的一些解释,让我非常的感兴 ...

  8. 算法笔记--STL中的各种遍历及查找(待增)

    算法笔记 map: map<string,int> m; map<string,int>::iterator it;//auto it it = m.begin(); whil ...

  9. 算法笔记--priority_queue

    算法笔记 priority_queue<int>que;//默认大顶堆 或者写作:priority_queue<int,vector<int>,less<int&g ...

随机推荐

  1. OpenGL学习笔记 之一 (基本的图形绘制)

    参考网址:http://www.cnblogs.com/FredCong/archive/2012/10/13/2722893.html #include <glut.h> #includ ...

  2. Codis-FE配置启动

    生成配置信息: ./codis-admin --dashboard-list --zookeeper= | tee conf/codis.json 如果当前目录下还没有创建logs文件夹,请先创建lo ...

  3. [学习笔记] Blender 常用工具 移动与旋转,缩放, 变换

    点击上面的移动图标之后,可在X,Y,Z轴移动物体. shift+S 之后,可有更多的移动选项. 旋转:可沿X,Y, Z 进行旋转 缩放 还可输入缩放的具体数值,更精确. 变换 可同时做移动.旋转.缩放 ...

  4. C# 自定义特性(Attribute)详解

    什么是特性 特性的定义:公共语言运行时允许添加类似关键字的描述声明,叫做attribute,它对程序中的元素进行标注,如类型.字段.方法.和属性等.attribute和.NetFramework文件的 ...

  5. python 脚本bak文件还原mssql数据库

    # -*- coding=utf-8 -*- import pyodbc from datetime import datetime import pymssql import decimal cla ...

  6. Mysql主从复制原理及同步延迟问题

    本文转载自:Mysql主从复制原理及同步延迟问题 主从复制解决的问题 数据分布:通过复制将数据分布到不同地理位置 负载均衡:读写分离以及将读负载到多台从库 备份:可作为实时备份 高可用性:利用主主复制 ...

  7. 详解Cookie、Session和缓存

    1 Cookie和Session Cookie和Session都为了用来保存状态信息,都是保存客户端状态的机制,它们都是为了解决HTTP无状态的问题而所做的努力. Session可以用Cookie来实 ...

  8. Python_OpenCV视频截取并保存

    在图像处理之前,我们需要对拿到手的数据进行筛选,对于视频,我们需要从中截取我们需要的一段或几段 整体思路比较简单,通过设定截取视频的起止时间(帧数),可以将该时间段内的图像保存为新的视频 直接上代码: ...

  9. 100天搞定机器学习|Day4-6 逻辑回归

    逻辑回归avik-jain介绍的不是特别详细,下面再唠叨一遍这个算法. 1.模型 在分类问题中,比如判断邮件是否为垃圾邮件,判断肿瘤是否为阳性,目标变量是离散的,只有两种取值,通常会编码为0和1.假设 ...

  10. 安装jar包到本地仓库

    1.控制台安装 安装指定文件到本地仓库命令:mvn install:install-file-DgroupId=<groupId>       : 设置项目代码的包名(一般用组织名)-Da ...