社区讨论
样例没过,交上去A掉了
P2485[SDOI2011] 计算器参与者 3已保存回复 3
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 3 条
- 当前快照
- 1 份
- 快照标识符
- @lo95q1pm
- 此快照首次捕获于
- 2023/10/28 06:00 2 年前
- 此快照最后确认于
- 2023/10/28 06:00 2 年前
我写的是最朴素的 的BSGS,第三个样例直接没过,交上去AC了。
代码:
CPP#include<bits/stdc++.h>
#define int long long
using namespace std;
int p,a,b;
int fpow(int a,int b,int mod){
int ret=1;
for(;b;b>>=1){
if(b&1)ret=1LL*ret*a%mod;
a=1LL*a*a%mod;
}return ret;
}
map<int,int>hs;
int bsgs(int a,int b,int p){
hs.clear();
b%=p;int t=sqrt(p)+1;
for(int i=0;i<t;i++)
hs[b*fpow(a,i,p)%p]=i;
a=fpow(a,t,p);
if(!a)return b==0?1:-1;
for(int i=1;i<=t;i++){
int val=fpow(a,i,p);
int j=hs.find(val)==hs.end()?-1:hs[val];
if(j>=0&&i*t-j>=0)return i*t-j;
}return -1;
}
int exgcd(int a,int b,int &x,int &y){
int d=a;
if(b==0)x=1,y=0;
else d=exgcd(b,a%b,y,x),y-=a/b*x;
return d;
}
signed main(){
int T,op;
cin>>T>>op;
while(T--){
int a,b,p;
cin>>a>>b>>p;
if(op==1)cout<<fpow(a,b,p)<<endl;
else if(op==2){
int x,y;
if(b%exgcd(a,p,x,y)!=0)cout<<"Orz, I cannot find x!"<<endl;
else{
int x,y;
exgcd(a,p,x,y);
x=1LL*x*b%p;
x+=p;x%=p;
cout<<x<<endl;
}
}
else if(op==3){
if(b==1){
cout<<"0"<<endl;
continue;
}
int ret=bsgs(a,b,p);
if(ret==-1)cout<<"Orz, I cannot find x!"<<endl;
else cout<<ret<<endl;
}
}
return 0;
}
回复
共 3 条回复,欢迎继续交流。
正在加载回复...