exBSGS

已知数\(a,p,b\),求满足\(a^x≡b\ (\bmod p)\)的最小自然数\(x\)。

\(100\%\)的数据,\(a,p,b≤10^9\)。

_皎月半洒花的题解

其实本质上,当\(p\)不为素数时,我们无法进行朴素 BSGS 的原因是我们的欧拉定理\(a^{\varphi(p)} \equiv b(\bmod p)\) 只能处理\((a,p)=1\)的情况。那么我们知道,朴素的 BSGS 的关键在于,可以保证最小解是有界的——\(x\)一定在\([1,\varphi(p)]\)中。所以最后 BSGS 的复杂度才会是\(\Theta(\sqrt{\varphi(p)})\) 的——比如说比较常见的\(p\)是素数的情况下,时间复杂度为\(\Theta(p)\)。

那么也就是说,我们只需要进行一些操作,保证\((a,p)=1\)即可。

我们思考,对于同余式\(a^x\equiv b~(\bmod p)\)而言,我们先假定\((a,p)>1\)。而此时如果有\(((a,p), b)=1\),那么说明此式只有可能在\(x=0,b=1\)的时候有解——这个结论是平凡的。因为假设我们把它展开成\(a\cdot a^{x-1} +kp=b\)的形式,必须要有\((a,p) ~|~ b\)的情况下,才能保证\(a^{x-1}\)和\(k\)都是整数。

那么对于\((a,p)>1\)且\((a,p)~|~b\),我们令原式变成

\[ a^{x-1}\cdot \frac{a}{(a,p)} \equiv \frac{b}{(a,p)} (\bmod \frac{p}{(a,p)}) $$ 的样子,如果此时$(a^{x-1},\frac{p}{(a,p)})=1$ 的话,我们就直接解

$$ a^{x-1}\equiv \frac{\frac{b}{(a,p)}} {\frac{a}{(a,p)} }(\bmod \frac{p}{(a,p)}) $$ 这个方程即可。否则我们继续分解直至$(p',a)=1$。

那么此时有个问题需要注意,就是如果们在解这个方程时,出现了

$$ (a^{x-1}, \frac{p}{(a,p)})\nmid \frac{\frac{b}{(a,p)}} {\frac{a}{(a,p)} } $$ 的情况,那我们需要特判并`return -1` ;另一种情况,如果我们出现了

$$ a^{x-1}\equiv \frac{\frac{b}{(a,p)}} {\frac{a}{(a,p)} } \equiv1(\bmod \frac{p}{(a,p)}) $$ 的情况,也需要特判并输出此$k$(此时同余式左边是$a^{x-k}$,因为$a^{x-k}\equiv1~(\bmod p)$所以直接输出$k$),不过也有可能不需要,完全看你写的 BSGS 能不能判断$x=0$的情况……一般情况下不能。

算法流程大体就是这些。有些需要注意的是,BSGS 有两种写法。我的这种写法是小步为$a^j$,大步为$a^{-im}b$。此时由于$p$不再是素数,所以不能用费马小定理,需要我们用exgcd的方法求逆元,包括但不限于$\frac{b}{(a,p)}$的逆元和$a^{-im}$。

```cpp
#include<bits/stdc++.h>
#define co const
#define il inline
template<class T> T read(){
T x=0,w=1;char c=getchar();
for(;!isdigit(c);c=getchar())if(c=='-') w=-w;
for(;isdigit(c);c=getchar()) x=x*10+c-'0';
return x*w;
}
template<class T>il T read(T&x){
return x=read<T>();
}
using namespace std;
typedef long long LL;

unordered_map<LL,int> H;
int N,M,P,ans;

LL gcd(LL a,LL b){
if(!b) return a;
return gcd(b,a%b);
}
LL expow(LL a,LL b,LL mod){
LL res=1;
for(;b;b>>=1,a=a*a%mod)
if(b&1) res=res*a%mod;
return res;
}
LL exgcd(LL&x,LL&y,LL a,LL b){
if(!b){
x=1,y=0;
return a;
}
LL t=exgcd(y,x,b,a%b);
y-=x*(a/b);
return t;
}
LL BSGS(LL a,LL b,LL mod,LL d){
H.clear();
LL Q,p=ceil(sqrt(mod)),x,y;
exgcd(x,y,d,mod),b=(b*x%mod+mod)%mod;
Q=expow(a,p,mod),exgcd(x,y,Q,mod),Q=(x%mod+mod)%mod;
for(LL i=1,j=0;j<=p;++j,i=i*a%mod)
if(!H.count(i)) H[i]=j;
for(LL i=b,j=0;j<=p;++j,i=i*Q%mod)
if(H.count(i)) return j*p+H[i];
return -1;
}
LL exBSGS(){
if(M==1) return 0;
LL d=1,k=0;
for(LL nd;(nd=gcd(N,P))>1;){
if(M%nd) return -1;
++k,M/=nd,P/=nd,d=d*(N/nd)%P;
if(d==M) return k;
}
LL ans;
return (ans=BSGS(N,M,P,d))==-1?-1:ans+k;
}
int main(){
while(read(N)|read(P)|read(M)){
N%=P,M%=P,ans=exBSGS();
if(ans<0) puts("No Solution");
else printf("%d\n",ans);
}
return 0;
}
```\]

LG4195 【模板】exBSGS的更多相关文章

  1. 模板BSGS(SDOI2011计算器) 模板EXBSGS

    BSGS和EXBSGS是OI中用于解决A^xΞB(mod C)的常用算法. 1.BSGS BSGS用于A,C互质的情况. 令m=sqrt(C),此时x可表示为i*m+j. 式中i和j都<=sqr ...

  2. 【模板】exBSGS/Spoj3105 Mod

    [模板]exBSGS/Spoj3105 Mod 题目描述 已知数\(a,p,b\),求满足\(a^x\equiv b \pmod p\)的最小自然数\(x\). 输入输出格式 输入格式: 每个测试文件 ...

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

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

  4. Luogu4195 【模板】exBSGS(exBSGS)

    如果a和p互质,用扩欧求逆元就可以直接套用普通BSGS.考虑怎么将其化至这种情况. 注意到当x>=logp时gcd(ax,p)是一个定值,因为这样的话每个存在于a中的质因子,其在ax中的出现次数 ...

  5. P4195 【模板】exBSGS/Spoj3105 Mod

    传送门 首先要懂得 $BSGS$,$BSGS$ 可以求出关于 $Y$ 的方程 $X^Y \equiv Z (mod\ mo)$ 的最小解,其中 $gcd(X,Z)=1$ $exBSGS$ 算是 $BS ...

  6. BZOJ 3122 SDOI2013 随机数发生器 数论 EXBSGS

    标题效果:给定一列数X(i+1)=(a*Xi+b)%p 最低要求i>0.所以Xi=t 0.0 这个问题可以1A那很棒 首先讨论特殊情况 如果X1=t ans=1 如果a=0 ans=b==t? ...

  7. BZOJ2480Spoj3105 Mod&BZOJ1467Pku3243 clever Y——EXBSGS

    题目描述 已知数a,p,b,求满足a^x≡b(mod p)的最小自然数x. 输入     每个测试文件中最多包含100组测试数据.     每组数据中,每行包含3个正整数a,p,b.     当a=p ...

  8. exBSGS·BSGS-Senior/扩展的BSGS

    \(\rm{0x01\quad Preface}\) \(emmm\)严格来讲,不应该被算到一个模板里面.因为在我看来模板是人构造出来的,但是这个算法应该是一个解决问题的\(process\)-更像是 ...

  9. exBSGS学习笔记

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

随机推荐

  1. php_mvc实现步骤六

    shop34-1-目录布局 存在项目的根目录 shop34 框架代码与应用程序代码划分 框架代码: 在各个应用程序间可以通用的代码. 应用程序代码: 当前项目的业务逻辑实现的代码. 分别创建两个子目录 ...

  2. [C语言] 关于计算多边形面积的一点问题

    [一道练习题] 面基 时间限制:1000ms   内存限制:65536kb 通过率:107/134 (79.85%)    正确率:107/319 (33.54%) 题目描述 按顺时针或逆时针顺序输入 ...

  3. LeetCode 513. 找树左下角的值(Find Bottom Left Tree Value)

    513. 找树左下角的值 513. Find Bottom Left Tree Value 题目描述 给定一个二叉树,在树的最后一行找到最左边的值. LeetCode513. Find Bottom ...

  4. AOP+Redis锁防止表单重复提交

    确保分布式锁同时满足以下四个条件 1.互斥性.在任意时刻,只有一个客户端能持有锁 2.不会发生死锁.即使有一个客户端在持有锁的期间崩溃而没有主动解锁,也能保证后续其他客户端能加锁 3.具有容错性.只要 ...

  5. Java集合对比

    1.array和ArrayList 的区别?1.1:ArrayList是Array的复杂版本1.2:数组不能扩容集合可以扩容1.3:存储的数据类型:Array只能存储相同数据类型的数据,而ArrayL ...

  6. 颜色转换、随机、16进制转换、HSV

    颜色转换.随机.16进制转换.HSV: /** * * *-----------------------------------------* * | *** 颜色转换.随机.16进制转换.HSV * ...

  7. 用PHP写PHP7扩展,超级简单对吧!

    [图片打不开,请用代理] 介绍: PHP扩展是编译库,它允许在您的PHP代码中使用特定的功能(主要是使用C编写的php扩展). 例如,您需要使用PHP使用SQLite3,您可以实现自己的方法和功能来连 ...

  8. 易百教程人工智能python修正-人工智能监督学习(回归)

    回归是最重要的统计和机器学习工具之一. 我们认为机器学习的旅程从回归开始并不是错的. 它可以被定义为使我们能够根据数据做出决定的参数化技术,或者换言之,允许通过学习输入和输出变量之间的关系来基于数据做 ...

  9. canvas上画出坐标集合,并标记新坐标,背景支持放大缩小拖动功能

    写在前面:项目需求,用户上传一个区位的平面图片,用户可以在图片上添加新的相机位置,并且展示之前已绑定的相机坐标位置,图片支持放大缩小&拖动的功能.新增坐标,页面展示相对canvas定位,保存时 ...

  10. iOS - xcode经常报的经典error解决办法大全

    1.错误信息: 2015-10-28 10:39:55.933 XFW[2696:55982] *** Assertion failure in -[UITableView _configureCel ...