BSGS算法初探
前言
\(BSGS\)算法,全称\(Baby\ Step\ Giant\ Step\),即大小步算法。某些奆佬也称其为拔(Ba)山(Shan)盖(Gai)世(Shi)算法。
它的主要作用是求解形式如\(x^t\equiv y(mod\ MOD)\)的式子中\(t\)的值\((gcd(x,MOD)=1)\)。
而且,它是一个简单易懂的算法(毕竟连我这样的数学渣渣都能理解)。
一个简单的性质
首先,我们需要知道一个简单的性质。
由费马小定理可得,\(x^{MOD-1}\equiv1(mod\ MOD)\)。
因此,当\(t\ge MOD-1\)时,会出现一个循环节。
于是我们就能保证答案\(t\)如果存在,则必然\(<MOD-1\)。
这是一个简单而又重要的性质。
\(BSGS\)算法的主要思想
\(BSGS\)算法的主要思想就是两个字:分块(提到分块就要\(\%\)一波分块奆佬\(hl666\))。
根据分块思想,我们设一个变量\(Size=\sqrt{MOD}\)(注意,此处要用\(ceil\)函数向上取整,这样才能保证\(Size*Size\ge MOD\),不然可能会遗漏答案)。
不难发现,此时的\(t\)可以表示为\(i*Size-j\)(\(i,j\)均为非负整数且\(j<Size\))。
那么原式就被转化成了\(x^{i*Size-j}\equiv y(mod\ MOD)\)。
移项得\(x^{i*Size}\equiv x^j*y(mod\ MOD)\)。
然后怎么处理呢?
我们可以对\(x^j*y\)的值进行一波预处理,用一个\(map\)存储下来。
然后枚举\(i\),判断\(x^{i*Size}\)的值是否存在即可。
当找到一个合法的\(i\)后,最终的答案就是\(i*Size-j\)。
时间复杂度分析
预处理的时间复杂度显然是\(O(j)\)的,枚举\(i\)的时间复杂度显然是\(O(i)\)的。
又由于\(i\)和\(j\)都是\(O(\sqrt N)\)大小的,所以总复杂度也是\(O(\sqrt N)\)级别的,是一个比较优秀的算法。
代码
map<int,int> s;//定义一个map
inline int BSGS(int x,int y,int MOD)//对于一个式子x^t=y(mod MOD),求出t的值
{
register int i,t=1,base,Size=ceil(sqrt(MOD));//注意此处要用ceil函数向上取整
for(i=0;i<=Size;++i) s[1LL*t*y%MOD]=i,base=t,t=1LL*t*x%MOD;//预处理将(x^j)*y的值全部用map存下对应的j,并用base存储下x^Size
for(t=base,i=1;i<=Size;++i,t=1LL*t*base%MOD)//枚举i,每次将t乘上x^Size
if(s[t]) return i*Size-s[t];//找到一个合法的i,则答案就是i*Size-j
return 0;//无解返回0
}
BSGS算法初探的更多相关文章
- 【codevs 1565】【SDOI 2011】计算器 快速幂+拓展欧几里得+BSGS算法
BSGS算法是meet in the middle思想的一种应用,参考Yveh的博客我学会了BSGS的模版和hash表模板,,, 现在才会hash是不是太弱了,,, #include<cmath ...
- bzoj2242: [SDOI2011]计算器 && BSGS 算法
BSGS算法 给定y.z.p,计算满足yx mod p=z的最小非负整数x.p为质数(没法写数学公式,以下内容用心去感受吧) 设 x = i*m + j. 则 y^(j)≡z∗y^(-i*m)) (m ...
- [BSGS算法]纯水斐波那契数列
学弟在OJ上加了道"非水斐波那契数列",求斐波那契第n项对1,000,000,007取模的值,n<=10^15,随便水过后我决定加一道升级版,说是升级版,其实也没什么变化,只 ...
- BSGS算法
BSGS算法 我是看着\(ppl\)的博客学的,您可以先访问\(ppl\)的博客 Part1 BSGS算法 求解关于\(x\)的方程 \[y^x=z(mod\ p)\] 其中\((y,p)=1\) 做 ...
- BSGS算法及扩展
BSGS算法 \(Baby Step Giant Step\)算法,即大步小步算法,缩写为\(BSGS\) 拔山盖世算法 它是用来解决这样一类问题 \(y^x = z (mod\ p)\),给定\(y ...
- uva11916 bsgs算法逆元模板,求逆元,组合计数
其实思维难度不是很大,但是各种处理很麻烦,公式推导到最后就是一个bsgs算法解方程 /* 要给M行N列的网格染色,其中有B个不用染色,其他每个格子涂一种颜色,同一列上下两个格子不能染相同的颜色 涂色方 ...
- BSGS算法及其扩展
bsgs算法: 我们在逆元里曾经讲到过如何用殴几里得求一个同余方程的整数解.而\(bsgs\)就是用来求一个指数同余方程的最小整数解的:也就是对于\(a^x\equiv b \mod p\) 我们可以 ...
- BSGS算法学习笔记
从这里开始 离散对数和BSGS算法 扩展BSGS算法 离散对数和BSGS算法 设$x$是最小的非负整数使得$a^{x}\equiv b\ \ \ \pmod{m}$,则$x$是$b$以$a$为底的离散 ...
- bsgs算法详解
例题 poj 2417bsgs http://poj.org/problem?id=2417 这是一道bsgs题目,用bsgs算法,又称大小步(baby step giant step)算法,或者 ...
随机推荐
- 清北刷题冲刺 11-01 p.m
轮换 #include<iostream> #include<cstdio> #include<cstring> #define maxn 1010 using n ...
- github上虽然已经有实现好的Char RNN
前言 学习RNN的时候很多人应该都有看过Andrej Karpathy写的The Unreasonable Effectiveness of Recurrent Neural Networks,使用基 ...
- 移动web 的viewport设置注意事项的详细解释 六一快乐=-_-_
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- iOS开发之swift与OC混编出现的坑,oc中不能对swift的代理进行调用,不能访问swift中的代理,swift中的回调方法
1. Swift与oc混编译具体怎么实现,这儿我就不重复讲出了,网上有大把的人讲解. 2. 在swift与OC混编的编译环境下, oc类不能访问swift创建类中的代理? 解决方法如下: 在代理的头部 ...
- Java基础笔记(九)—— 流程控制
Java三大流程控制语句:顺序.选择.循环. if结构.if-else结构.多重if.嵌套if. public class Test { public static void main(String[ ...
- before和after兼容性测试
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 由奇葩cookie导致服务器500来认识cookie
问题:cookie中文会导致服务器报500错误. 一:cookie的特点 1.以键值对的形式出现的,比如:a=b;b=c 2.中文的值需要转义 cookie的例子 <!DOCTYPE html& ...
- Luogu P3223 [HNOI2012]排队 组合
本来做了一道 P4901 排队 后来发现自己做错题了...到也都是数学qwq 这题最恶心的就是两只(雾)老师. 那我们分类讨论: 1.两个老师之间是男生: $ A(n,n)*A(n+1,2)*A(n ...
- Subversion Server Edge的搭建与配置
1.Subversion Server Edge的搭建 当在操作系统为64位的配置服务器上部署时只能够选择Collabnet Subversion Edge,它集合了Subversion所需要一切资源 ...
- 【ACM】喷水装置
喷水装置(一) 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 现有一块草坪,长为20米,宽为2米,要在横中心线上放置半径为Ri的喷水装置,每个喷水装置的效果都会让以 ...