BSGS与exBSGS学习笔记
\(BSGS\)用于解决这样一类问题:
求解\(A^x ≡B(modP)\)的最小\(x\),其中\(P\)为质数。
这里我们采用分块的方法,把\(x\)分解为\(i *t-b\)(其中\(t\)是分块大小) 。根据模意义下逆元的性质,\(x\)的大小一定\(<=phi(p)\)即\(p - 1\),所以经过移项和进行存在性对比,我们就可以\(O(N)\)求出答案。
int BSGS (int A, int B, int P) {
int t = (int) ceil (sqrt (P));
for (int j = 0; j < t; ++j) {
mp[_mul (B, _pow (A, j, P), P)] = j;
//mp[ B * A ^ j ] = j;
}
A = _pow (A, t, P);
for (int i = 1; i <= t; ++i) {
int val = _pow (A, i, P);
//val = A^{i*t};
int j = mp.find (val) == mp.end () ? -1 : mp[val];
if (j >= 0) {
return i * t - j;
}
}
return -1;
}
上面这份代码中其实还可以把快速幂的\(log\)优化掉,可能会被卡常。
几个要注意的关键点:
- 避免快速幂
- 优化快速乘
- 小心取模和\(longlong\)
- \(p\)一定要是质数!
- 建议手写哈希不然会多一个\(log\)(\(unordered\_map\)是不允许使用的)
\(exBSGS\)其实就是一个简单的扩展,把情况扩展到了\(p\)不是质数的情况,这种情况我们要先把\(P\)和\(A\)化为互质的状态。也就是说:对\(A\)和\(P\)取\(gcd\)直到其互质为止,从而化为如下形式:
\]
其中,当\(B\)不能被二者的\(gcd\)整除时,就意味着原方程无解。
几个注意点:
- 前面的\((A/d)^{cnt}\)同样需要统计进去
- 要使用\(exgcd\)求解,因为可能不存在逆元。
- 可能存在\(x==0\)的情况,记得特判
- 快速乘,\(longlong\),取模,务必小心。
int exbsgs (int A, int B, int p) {
if (B == 1) return 0;
int _gcd, cnt = 0, res = 1;
while ((_gcd = gcd (A, p)) != 1) {
if (B % _gcd) return -1;
B /= _gcd, p /= _gcd, ++cnt;
res = ((res % p) * (A / _gcd)) % p;
if (res == B) return cnt;
}
int t = sqrt (p) + 1, tmp = 1;
Hash.clear ();
for (int i = 0; i < t; ++i) {
Hash[(tmp * B) % p] = i;
tmp = (tmp * A) % p;
}
res = (res * tmp) % p;
for (int i = 1; i <= t; ++i) {
if (Hash.find (res) != Hash.end ()) {
return i * t - Hash[res] + cnt;
}
res = (res * tmp) % p;
}
return -1;
}
BSGS与exBSGS学习笔记的更多相关文章
- exBSGS学习笔记
exBSGS学习笔记 Tags:数学 题目的话就做下洛谷的模板好了 // luogu-judger-enable-o2 #include<algorithm> #include<io ...
- 数论算法 剩余系相关 学习笔记 (基础回顾,(ex)CRT,(ex)lucas,(ex)BSGS,原根与指标入门,高次剩余,Miller_Rabin+Pollard_Rho)
注:转载本文须标明出处. 原文链接https://www.cnblogs.com/zhouzhendong/p/Number-theory.html 数论算法 剩余系相关 学习笔记 (基础回顾,(ex ...
- OI数学 简单学习笔记
基本上只是整理了一下框架,具体的学习给出了个人认为比较好的博客的链接. PART1 数论部分 最大公约数 对于正整数x,y,最大的能同时整除它们的数称为最大公约数 常用的:\(lcm(x,y)=xy\ ...
- OI知识点|NOIP考点|省选考点|教程与学习笔记合集
点亮技能树行动-- 本篇blog按照分类将网上写的OI知识点归纳了一下,然后会附上蒟蒻我的学习笔记或者是我认为写的不错的专题博客qwqwqwq(好吧,其实已经咕咕咕了...) 基础算法 贪心 枚举 分 ...
- js学习笔记:webpack基础入门(一)
之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...
- PHP-自定义模板-学习笔记
1. 开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2. 整体架构图 ...
- PHP-会员登录与注册例子解析-学习笔记
1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...
- 2014年暑假c#学习笔记目录
2014年暑假c#学习笔记 一.C#编程基础 1. c#编程基础之枚举 2. c#编程基础之函数可变参数 3. c#编程基础之字符串基础 4. c#编程基础之字符串函数 5.c#编程基础之ref.ou ...
- JAVA GUI编程学习笔记目录
2014年暑假JAVA GUI编程学习笔记目录 1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之 ...
随机推荐
- 七、.net core下配置、数据库访问等操作实现
配置读取 .net core下读取配置还是有点麻烦的,本身没有System.Configuration.dll,所以在进行配置前需要自行引用Microsoft.Extensions.Configura ...
- ES 6 系列 - Promise
一.含义 是异步编程的一种解决方案,es 6 将其变成了标准. 简单的说是一个容器,里面保存了某个未来才会结束的事件(通常是一个异步操作)的结果.语法上, Promise 是一个对象,从它可以获取异步 ...
- How to install Lion on PC
open 'InstallESD.dmg' open '/Volumes/Mac OS X Install ESD/BaseSystem.dmg' rm '/Volumes/Mac OS X Base ...
- July 算法习题 - 字符串4(全排列和全组合)
https://segmentfault.com/a/1190000002710424 思想:当前层各节点首元素不同,则各节点的剩余元素也不同:下一层节点交换范围为首元素以外的元素 全排列算法: vo ...
- Bash 5.0 发布及其新功能
导读 邮件列表证实最近发布了 Bash-5.0.而且,令人兴奋的是它还有新的功能和变量.如果你一直在使用 Bash 4.4.XX,那么你一定会喜欢 Bash 的第五个主要版本. 第五个版本侧重于新的 ...
- ElasticSearch查询 第四篇:匹配查询(Match)
<ElasticSearch查询>目录导航: ElasticSearch查询 第一篇:搜索API ElasticSearch查询 第二篇:文档更新 ElasticSearch查询 第三篇: ...
- UNIX口令破解机
在编写我们的UNIX口令破解机时,我们需要使用UNIX 计算口令hash 的crypt()算法.Python 标准库中已自带有crypt 库.要计算一个加密的UNIX 口令hash,只需调用函数cry ...
- PHP——base64的图片转为文件图片
前言 网上很多,真的是有毒吧,一个那么简单至于写的乱七八糟的嘛,醉了. 代码 具体都写注释中了,不懂的可以评论或者私信我 public function upload() { //接收前台的值 $ba ...
- BZOJ5203 [NEERC2017 Northern] Grand Test 【dfs树】【构造】
题目分析: 首先观察可知这是一个无向图,那么我们构建出它的dfs树.由于无向图的性质我们可以知道它的dfs树只有返祖边.考虑下面这样一个结论. 结论:若一个点的子树中(包含自己)有两个点有到它祖先的返 ...
- Linux CAT与ECHO命令详解
Linux CAT与ECHO命令详解 cat命令是Linux下的一个文本输出命令,通常是用于观看某个文件的内容的: cat主要有三大功能: 1.一次显示整个文件. $ cat filename 2.从 ...