社区讨论

样例没过,交上去A掉了

P2485[SDOI2011] 计算器参与者 3已保存回复 3

讨论操作

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

当前回复
3 条
当前快照
1 份
快照标识符
@lo95q1pm
此快照首次捕获于
2023/10/28 06:00
2 年前
此快照最后确认于
2023/10/28 06:00
2 年前
查看原帖
我写的是最朴素的 gcd(a,p)=1\gcd(a,p)=1 的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 条回复,欢迎继续交流。

正在加载回复...