Luogu P3846 BSGS算法
阅读原文时间:2023年07月09日阅读:1
https://www.luogu.com.cn/problem/P3846

BSGS这个东西是用来干啥的?

形如下面这个式子:

\[a^b = c\;(mod\;p)
\]

其中:p是一个质数。\(2\leq a,b<p\leq2^{31}-1\)

求一个最小的正整数b,使得式子成立

首先,我们要知道一个东西。这个式子是有循环节的

根据费马小定理:p是质数,且a不是p的倍数时

有:\(a^{p-1}\equiv1\;(mod\;p)\)

而:\(a^0=1\)

因此答案是落在\([0,p-2]\)这个区间内的:


暴力:枚举b

时间复杂度:\(O(p) \;\;\;=>TLE\)


BSGS算法:

我们考虑将这个区间分块:

\[a^0,a^1,a^2,\cdots,a^{\sqrt{p}-1}
\]

\[a^{\sqrt{p}},a^{\sqrt{p}+1},\cdots,a^{2\sqrt{p}-1}
\]

\[\cdots
\]

\[a^{^{(\sqrt{p}-1)×\sqrt{p}}},\cdots,a^{p-1}
\]

然后我们进行下面的操作

①扫描第一行,若其中有答案,直接输出

②我们发现一个很显然的性质:第i行与第1行的同一列上的两个数,比值为:\(a^{(i-1)×\sqrt{p}}\)

若在第i行中,存在:

\[a^k=c\;(mod\;p)
\]

则说明在第一行中,存在:

\[a^r=\frac{c}{a^{(i-1)×\sqrt{p}}}
\]

而除(÷)操作,只需乘上它的逆元即可

根据费马小定理:

\[∵a^{p-1}\equiv1(mod\;p)
\]

\[∴a^{p-2}×a\equiv1(mod\;p)
\]

而\(a^{p-2}\)显然为a在模p意义下的逆元

因此:对于第i行,我们只需查询第一行。即可判断第i行是否存在答案。

这个东西直接用哈希即可在log的时间内实现

时间复杂度:

\[O(\sqrt{p}×log\;p)\;\;=> AC
\]

代码如下:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<map>
using namespace std;

#define int long long
int a,d,p,s[233333],sq;
map<int,int> mp;
int ksm(int a,int b,int mod)//快速幂
{
    int ans=1;
    while(b)
    {
        if(b&1)ans=1LL*ans*a%mod;
        a=1LL*a*a%mod;
        b>>=1;
    }
    return ans;
}
int BSGS()
{
    sq=ceil(sqrt(p));
    s[0]=1;mp[1]=0;
    for(int i=1;i<=sq;i++)
    {
        s[i]=1LL*s[i-1]*a%p;
        mp[s[i]]=i;
        //用哈希表记录
        if(s[i]==d)return i;
        //若在第一行发现答案,直接输出
    }
    int dif=ksm(a,sq,p);
    for(int l=sq+1,r=sq+sq,i=2;l<p;l+=sq,r+=sq,i++)
    {
        int inv=ksm(dif,i-1,p);
        inv=ksm(inv,p-2,p);//求逆元
        int t=1LL*d*inv%p;
        if(mp.count(t))return mp[t]+(i-1)*sq;
        //如果在第1行中查询存在,则说明第i行有答案
    }
    return -1;//说明无解
}
signed main()
{
    scanf("%lld%lld%lld",&p,&a,&d);
    if(d>=p||a>=p)//特殊情况
    {
        puts("no solution");
        return 0;
    }
    int res=BSGS();
    if(res==-1)puts("no solution");
    else printf("%lld\n",res);
    return 0;
}

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章