BSGS

BSGS

代码实现挺简单
主要是注意一些点:

  • blo的取值是\(sqrt(p)+1\),保证A和B的取值范围
  • 特判一下\(a^{blo}=0\)的情况
  • 返回值保证是正数

一般数学题不卡常,用个map也没什么问题

#include<bits/stdc++.h>
#define int long long
#define F(i,i0,n) for(int i=(i0);i<=(n);i++)
#define D(i,n,i0) for(int i=(n);i>=i0;--i)
#define pii pair<int,int>
#define fr first
#define sc second
#define pb push_back
using namespace std;
inline int rd(){
    int f=0,x=0;char ch=getchar();
    while(!isdigit(ch)){if(ch=='-')f=1;ch=getchar();}
    while(isdigit(ch)){x=(x<<3)+(x<<1)+ch-48;ch=getchar();}
    return f?-x:x;
}
const int N=1e6+5;
int Pow(int a,int b,int p){int ans=1;for(;b;b>>=1,a=a*a%p)if(b&1)ans=ans*a%p;return ans;}
int a,b,p;
int BSGS(int a,int b,int p){
    int blo=sqrt(p)+1;
    map<int,int>mp;
    F(i,0,blo)mp[b*Pow(a,i,p)%p]=i;
    a=Pow(a,blo,p);
    if(a==0)return b==0?1:-1; 
    F(i,1,blo){
        int k=Pow(a,i,p);
        if(mp.count(k)!=0)return ((i*blo-mp[k])%p+p)%p;
    }
    return -1;
}
signed main(){
    p=rd();a=rd(),b=rd();
    int ans=BSGS(a,b,p);
    if(ans==-1)cout<<"no solution"<<'\n';
    else cout<<ans<<'\n'; 
    return 0;
}
posted @ 2023-11-11 11:00  ussumer  阅读(42)  评论(0)    收藏  举报