[15/08/19] BSGS & ex-BSGS 学习笔记
BSGS
,大步超大步小步算法,是求高次同余方程最小正整数解的一种常用算法。通常被用于求解形如使方程 ( ⊥ )成立的最小 。
算法的实现过程类似数学中的缩放法,将待求的指数 化为 ,通过枚举 来求解。
具体过程如下:
一:
二:
设 ,,,
则求
于是我们便可以从前往后枚举 以 为下标, 为值存入一个 中(预处理),再枚举 ,若存在 ,则 .
复杂度
Code:
//P3846
#include<bits/stdc++.h>
using namespace std;
int p,x,y,k,n,a;
map<int,int>M;
int qp(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(){
cin>>p>>a>>y;
int k=ceil(sqrt(p));n=y;
for(int i=0;i<k;i++){ //预处理
M[n]=i;
n=1ll*n*a%p;
}
int t=qp(a,k);x=1;
for(int i=1;i<=k;i++){ //枚举答案
x=1ll*x*t%p;
if(M.count(x)){printf("%d\n",i*k-M[x]);return 0;}
}
puts("no solution");return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具