\(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\)直到其互质为止,从而化为如下形式:

\[(A/d)^{cnt} * A^{x}≡B/d^{cnt} (mod P/d^{cnt})
\]

其中,当\(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学习笔记的更多相关文章

  1. exBSGS学习笔记

    exBSGS学习笔记 Tags:数学 题目的话就做下洛谷的模板好了 // luogu-judger-enable-o2 #include<algorithm> #include<io ...

  2. 数论算法 剩余系相关 学习笔记 (基础回顾,(ex)CRT,(ex)lucas,(ex)BSGS,原根与指标入门,高次剩余,Miller_Rabin+Pollard_Rho)

    注:转载本文须标明出处. 原文链接https://www.cnblogs.com/zhouzhendong/p/Number-theory.html 数论算法 剩余系相关 学习笔记 (基础回顾,(ex ...

  3. OI数学 简单学习笔记

    基本上只是整理了一下框架,具体的学习给出了个人认为比较好的博客的链接. PART1 数论部分 最大公约数 对于正整数x,y,最大的能同时整除它们的数称为最大公约数 常用的:\(lcm(x,y)=xy\ ...

  4. OI知识点|NOIP考点|省选考点|教程与学习笔记合集

    点亮技能树行动-- 本篇blog按照分类将网上写的OI知识点归纳了一下,然后会附上蒟蒻我的学习笔记或者是我认为写的不错的专题博客qwqwqwq(好吧,其实已经咕咕咕了...) 基础算法 贪心 枚举 分 ...

  5. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

  6. PHP-自定义模板-学习笔记

    1.  开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2.  整体架构图 ...

  7. PHP-会员登录与注册例子解析-学习笔记

    1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...

  8. 2014年暑假c#学习笔记目录

    2014年暑假c#学习笔记 一.C#编程基础 1. c#编程基础之枚举 2. c#编程基础之函数可变参数 3. c#编程基础之字符串基础 4. c#编程基础之字符串函数 5.c#编程基础之ref.ou ...

  9. JAVA GUI编程学习笔记目录

    2014年暑假JAVA GUI编程学习笔记目录 1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之 ...

随机推荐

  1. FMC

    FMC (FPGA Mezzanine Card) 编辑 FMC:英文全称,FPGA Mezzanine Card.是一个应用范围.适应环境范围和市场领域范围都很广的通用模块.FMC连接器(FMC C ...

  2. hdu-4738(tarjan割边)

    题意:给你n个点,m条边,边有权值,问你最小的花费使图不连通: 解题思路:就是求边权最小的割边,但这道题有坑点: 1.有重边(桥的两个点有重边时,你去掉一条边并没什么d用): 2.当权值为0的时候,我 ...

  3. Nginx 缓存深入理解

    100课陶辉 proxy_cache_methods 指令主要是根据请求方法指定是否使用缓存 Syntax: proxy_cache_methods GET | HEAD | POST ...; De ...

  4. HUST 1541 解方程

    参考自:https://www.cnblogs.com/ECJTUACM-873284962/p/6394836.html 1541 - Student’s question 时间限制:1秒 内存限制 ...

  5. pycharm2019+破解补丁

    事先声明,由于本人的pycharm已经装好,故部分图片来自网络,转载请注明地址 这篇博文以前是2018版本 后来换电脑重装时发现失效了 索性装的2019版本 具体步骤可以参考下面的删除线,新的补丁和激 ...

  6. Python入门-编写抓取网站图片的爬虫-正则表达式

    //生命太短 我用Python! //Python真是让一直用c++的村里孩子长知识了! 这个仅仅是一个测试,成功抓取了某网站1000多张图片. 下一步要做一个大新闻 大工程 #config = ut ...

  7. 【XSY2808】董先生的休闲方案 组合数学

    题目描述 有\(n\)个方案,编号为\(1\ldots n\). 最开始你不知道每个方案的编号. 你要按顺序提出这些方案. 每一个时刻你要做以下事情: 如果你阅读过下一个方案,就提出这个方案. 否则随 ...

  8. 【ARC072E】Alice in linear land DP

    题目大意 有一个人要去直线上\(lm\)远处的地方,他会依次给他的机器发出\(n\)个指令.第\(i\)个指令为\(d_i\).他的机器收到一个指令\(x\)后,如果向目的地方向前进\(xm\)后比当 ...

  9. springmvc返回xml格式、json格式数据

    问:@ResponseBody注解怎么指定返回xml 还是json答:@RequestMapping 的produces 属性指定 produces = "application/xml&q ...

  10. Java8的Stream语法详解(转载)

    1. Stream初体验 我们先来看看Java里面是怎么定义Stream的: A sequence of elements supporting sequential and parallel agg ...