[15/08/19] BSGS & ex-BSGS 学习笔记

  BSGS

  BSGS(Baby Step Gaint Step),大步超大步小步算法,是求高次同余方程最小正整数解的一种常用算法。通常被用于求解形如使方程 axy(mod p)pa )成立的最小 x

  BSGS 算法的实现过程类似数学中的缩放法,将待求的指数 x 化为 ap+b,通过枚举 a 来求解。

  具体过程如下:

    一:

    axy(mod p)

    akxk(kxkx)y(mod p)  (k=p)

    (ak)namy(mod p)  (n=xk,m=kxkx)

    (ak)ninv(am)y=amy

    

    二:

    设 k=px=nkmn[1,k)m[1,k)

    则求 (ak)ninv(am)y=amy

    

  于是我们便可以从前往后枚举 my(am)modp 为下标,m 为值存入一个 map 中(预处理),再枚举 n ,若存在 map[(ak)n],则 x=nkmap[(ak)n].

  复杂度 O(plogp)

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;
}
posted @   四氧化二磷  阅读(184)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· 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工具
点击右上角即可分享
微信分享提示