BSGS与exBSGS
大步小步(BSGS)#
模板题#
给定 求最小 满足 其中 互质
求法#
假定 , 其中
原式可化为
即
由于 互质,显然 互不相同
我们枚举 ,将 存入 表
然后枚举 ,从 表里找出第一个 满足
此时 即为所求
P3846 [TJOI2007] 可爱的质数/【模板】BSGS#
#include<bits/stdc++.h>
using namespace std;
#define int long long
int a,b,p;
map <int,int> mp;
inline int qpow(int x,int idx){
if(!idx) return 1;
int t=qpow(x,idx>>1);
if(idx&1) return t*t%p*x%p;
return t*t%p;
}
inline int BSGS(){
b%=p;
int t=sqrt(p)+1;
for(int i=0;i<t;++i)
mp[b*qpow(a,i)%p]=i;
a=qpow(a,t);
if(!a) return !b?1:-1;
for(int i=1;i<=t;++i){
int v=qpow(a,i);
if(mp.find(v)==mp.end()) continue;
int j=mp[v];
if(i*t-j>=0) return i*t-j;
}
return -1;
}
signed main(){
scanf("%lld%lld%lld",&p,&a,&b);
int ans=BSGS();
if(ans==-1) puts("no solution");
else printf("%lld\n",ans);
}
exBSGS#
P4195 【模板】扩展 BSGS/exBSGS#
回忆算法,给定整数,其中互质,求方程的最小整数解
做法:设
方程变为
化一下
这时只要把和预处理出来丢到哈希表里就做完了
而现在的不互质了,所以我们要考虑其他的方法,也就是
那么我们设
根据模的分配率,方程变为
无解情况就是并且
我们来证明一下
设,那么
代入到原方程中变为
这样子就是的因子,而只有在时,,其余情况若,方程无解
证毕
那么我们再把上面的式子化一下变为
而一定是比小的,所以可以一直约到互质
设
原式就可以写成 ,是做了几次化简
这样子就可以用求解啦
有一点需要注意,因为是在模意义下运算,所以除以时要乘其逆元
因为最后一直化到了和互质,所以和看起来也很互质
就可以用扩欧求逆元了
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现