社区讨论
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 条回复,欢迎继续交流。
正在加载回复...