BSGS

(感觉这东西还是要写一下)

BSGS主要用于求解形如\(x^k=y\pmod p\)(注意这里p与x互质)这样的方程的最小正整数解的问题

设\(m=\lceil\sqrt p\rceil,k=am-b,a\in[1,m],b\in[0,m)\)

那么上面的方程可以变形成\(x^{am}=yx^b\pmod p\)

枚举\(b\),计算出右边的值存到\(map\)中,枚举\(a\)查表即可

Q:可以枚举左边存表,右边查嘛?

A:可以,但是左边查到表可以直接输出...

顺便一说,map里要存最大值,这样你算出的答案是最小的,所以能更新就更新

复杂度:\(O(\sqrt plogp)\)

模板题[TJOI2007]可爱的质数

#include<bits/stdc++.h>
using namespace std;
int p;
map<int,int>M;
int ksm(int x,int y){
int s=1;
while(y){if(y&1)s=1ll*s*x%p;x=1ll*x*x%p;y>>=1;}
return s;
}
int main(){
int x,y;
cin>>p>>x>>y;
int m=sqrt(p)+1;
int s=y;
for(int i=0;i<m;i++){
M[s]=i;//能更新就更新
s=1ll*s*x%p;
}
int t=ksm(x,m);s=1;
for(int i=1;i<=m;i++){
s=1ll*s*t%p;
if(M.count(s)){printf("%d\n",i*m-M[s]);return 0;}
}
puts("no solution");return 0;
}

扩展BSGS

当p不是素数时(这时x,p不一定互质),

设d=gcd(x,p),

若d不整除y,那么只有y=1时,x=0,其他情况均无解

若d整除y,当d=1时,直接BSGS

否则有$$x^k=y\pmod p$$

\[x^{k-1}×\frac{x}{d}=\frac{y}{d}\pmod{\frac{p}{d}}
\]

继续分解到d=1为止.

\[x^{k-t}×\frac{x^t}{\prod d_i}=\frac{y}{\prod d_i}\pmod{\frac{p}{\prod d_i}}
\]

然后首先检验x=[0,t)是否为解,显然t是log级别的

如果[0,t)都不是解,由于\(x,\frac{p}{\prod d_i}\)互质,BSGS求解即可

最后记得答案加上t啊

模板题[SPOJ3105]MOD

#include<bits/stdc++.h>
using namespace std;
int re(){
int x=0,w=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
return x*w;
}
int p;
map<int,int>M;
void mul(int&x,int y){x=1ll*x*y%p;}
int ksm(int x,int y){
int s=1;
while(y){if(y&1)mul(s,x);mul(x,x);y>>=1;}
return s;
}
void exbsgs(int x,int y){
if(y==1){puts("0");return;}
int d=__gcd(x,p),k=1,t=0;
while(d^1){
if(y%d){puts("No Solution");return;}
++t;y/=d;p/=d;mul(k,x/d);
if(y==k){printf("%d\n",t);return;}
d=__gcd(x,p);
}
int s=y;M.clear();int m=sqrt(p)+1;
for(int i=0;i<m;i++){
M[s]=i;mul(s,x);
}
s=k;k=ksm(x,m);
for(int i=1;i<=m;i++){
mul(s,k);
if(M[s]){printf("%d\n",i*m-M[s]+t);return;}
}
puts("No Solution");
}
int main(){
int x,y;
while(1){
x=re(),p=re(),y=re();
if(!x&&!p&&!y)break;
x%=p;y%=p;
exbsgs(x,y);
}
return 0;
}

[note]BSGS & exBSGS的更多相关文章

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

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

  2. BSGS&ExBSGS

    BSGS&ExBSGS 求解形如 \[a^x\equiv b\pmod p\] 的高次同余方程 BSGS 假装\(gcd(a,p)=1\). 设\(m=\lceil\sqrt p \rceil ...

  3. 算法笔记--BSGS && exBSGS 模板

    https://www.cnblogs.com/sdzwyq/p/9900650.html 模板: unordered_map<int, int> mp; LL q_pow(LL n, L ...

  4. BSGS && EXBSGS

    基础BSGS 用处是什么呢w 大步小步发(Baby-Step-Giant-Step,简称BSGS),可以用来高效求解形如\(A^x≡B(mod C)\)(C为素数)的同余方程. 常用于求解离散对数问题 ...

  5. BSGS+exBSGS POJ2417+POJ3243

    a^x=b(mod p)求x,利用分块的思想根号p的复杂度求答案,枚举同余式两端的变量,用hash的方法去找最小的答案(PS:hash看上去很像链式前向星就很有好感).然后如果p不是质数时,就利用同余 ...

  6. Noip前的大抱佛脚----数论

    目录 数论 知识点 Exgcd 逆元 gcd 欧拉函数\(\varphi(x)\) CRT&EXCRT BSGS&EXBSGS FFT/NTT/MTT/FWT 组合公式 斯特林数 卡塔 ...

  7. 各种友(e)善(xin)数论总集(未完待续),从入门到绝望

    目录 快速幂 扩展欧几里得 GCD 扩展欧几里得 同余系列 同余方程 同余方程组 一点想法 高次同余方程 BSGS exBSGS 线性筛素数 埃式筛 欧拉筛 欧拉函数 讲解 两道水题 法雷级数 可见点 ...

  8. REHの收藏列表

    搬运自本人的AcWing,所以那里的文章会挺多. 友链(同类文章) :bztMinamoto 世外明月 mlystdcall 新人手册:AcWing入门使用指南 前言 有看到好文欢迎推荐(毛遂自荐也可 ...

  9. ZROI 2019 暑期游记

    ZROI 游记 在自闭中度过了17天 挖了无数坑,填了一点坑 所以还是有好多坑啊zblzbl 挖坑总集: 时间分治 差分约束 Prufer序列 容斥 树上数据结构 例题C (和后面的例题) 点分 最大 ...

随机推荐

  1. 百度地图 Android SDK - 标注(Marker)的基本使用

    标注(Marker)是开发人员最常使用的地图覆盖物志一.今天就来向大家介绍一些标注(Marker)的最基本用法! 实现目标: 1.构建基础地图页面: 2.在地图的中心点处加入 Marker: 3.实现 ...

  2. Angular 学习笔记——filter

    <!DOCTYPE html> <html lang="en" ng-app="myApp"> <head> <met ...

  3. 【转载】LR - 细节解析,为什么LR脚本会去访问“脚本中不存在的“资源?

    问题描述 同事遇到的一个问题,LR执行性能测试脚本时,总报出错误,无法访问一个图片的地址,但脚本中明明没有对该资源的请求. Action4.c(12): Warning -27796: Failed ...

  4. c语言用rand() 函数,实现random(int m)

    函数rand()是真正的随机数生成器.而srand()会设置供rand()使用的随机数种子. 假设你在第一次调用rand()之前没有调用srand(),那么系统会为你自己主动调用srand(). 注意 ...

  5. 【Excle数据透视表】如何为数据透视表应用样式

    如下数据透视表样例,如何为该数据透视表设置样式呢? 步骤 单击数据透视表区域的任意单元格→数据透视表工具→设计→数据透视表样式→打开下拉箭头即可任意选择

  6. 【VBA】查看当前窗口的宽与高

    打开的Excle如何使用VBA查看当前窗口的宽与高呢?代码如下: Sub 查看宽度与高度() Dim myWidth As Double Dim myHeigth As Double myWidth ...

  7. java 字符深入知识,待整理

    '编',"编",  为什么获取到的字节数组长度不一样 http://www.cnblogs.com/yongdaimi/p/5899328.html Unicode 官网 http ...

  8. TCP/IP协议分析(推荐)

    一;前言 学习过TCP/IP协议的人多有一种感觉,这东西太抽象了,没有什么数据实例,看完不久就忘了.本文将介绍一种直观的学习方法,利用协议分析工具学习TCP/IP,在学习的过程中能直观的看到数据的具体 ...

  9. Python---copy()、deepcopy()与赋值的区别

    copy()与deepcopy()之间的主要区别是python对数据的存储方式. 首先直接上结论: —–深复制,即将被复制对象完全再复制一遍作为独立的新个体单独存在.所以改变原有被复制对象不会对已经复 ...

  10. 微软“小冰”识狗与人工神经网络(I)

    2014年8月21日,微软"小冰"网络机器人推出了一项图像识别技能:"小冰识狗". "小冰"怎么会"识狗"呢? 依据微软 ...