社区讨论

40分求助

P4195【模板】扩展 BSGS / exBSGS参与者 1已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@mi7xjhyu
此快照首次捕获于
2025/11/21 05:14
4 个月前
此快照最后确认于
2025/11/21 05:14
4 个月前
查看原帖
数据下不了
CPP
#include<bits/stdc++.h>
using namespace std;
int a,b,p,ans;
unordered_map<int,int>h;
int gcd(int a,int b){return b?gcd(b,a%b):a;}
inline int qpow(int x,int y,int p,int z=1){
    for(;y;y>>=1,x=1LL*x*x%p)if(y&1)z=1LL*z*x%p;
    return z;
}
inline int bsgs(int a,int b,int p){
    h.clear();
    int t=sqrt(p)+1;
    for(int z,i=0;i<t;++i){
        if(i)z=1LL*z*a%p;
        else z=b;
        h[z]=i;
    }
    a=qpow(a,t,p);
    for(int z,j,i=0;i<=t;++i){
        if(i)z=1LL*z*a%p;
        else z=1;
        j=h.count(z)?h[z]:-1;
        if(j>=0&&i*t-j>=0)return i*t-j;
    }
    return -1;
}
int exbsgs(int a,int b,int p){
    int d,k=0,z=1,ans;
    if(b==1)return 0;
    while((d=gcd(a,p))>1){
        if(b%d)return -1;
        ++k;b/=d;p/=d;z=1LL*z*(a/d)%p;
        if(z==b)return k;
    }
    ans=bsgs(a,b,p);
    return ans==-1?-1:ans+k;
}
int main(){
    while(cin>>a>>p>>b){
        if(!a)return 0;
        ans=exbsgs(a,b,p);
        if(~ans)cout<<ans<<endl;
        else cout<<"No Solution\n";
    }
}

回复

1 条回复,欢迎继续交流。

正在加载回复...