求找错
查看原帖
求找错
147895
破壁人罗辑楼主2021/6/18 21:50
#include<bits/stdc++.h>
#define ULL unsigned long long
using namespace std;
ULL w;
inline unsigned int fastread(){
	unsigned int ret=0;
	char c=getchar();
	while(c<'0' || c>'9') c=getchar();
	while(c>='0' && c<='9'){
		ret=ret*10+(c&15);
		c=getchar();
	}
	return ret;
}
inline ULL ftread(){
	ULL ret=0;
	char c=getchar();
	while(c<'0' || c>'9') c=getchar();
	while(c>='0' && c<='9'){
		ret=ret*10+(c&15);
		c=getchar();
	}
	return ret;
}
struct num{
	ULL x,y;
};
ULL ksm(ULL n,ULL p,ULL m){
	if(p){
		if(p&1){
			if(p==1) return n;
			ULL ret=ksm(n,p>>1,m);
			return ret*n%m*ret%m;
		}
		ULL ret=ksm(n,p>>1,m);
		return ret*ret%m;
	}
	return 1;
}
inline num mul(num a,num b,ULL p){
	num ans={(a.x*b.x%p+a.y*b.y%p*w%p)%p,(a.x*b.y%p+a.y*b.x%p)%p};
	return ans;
}
inline ULL powi(num a,ULL b,ULL p){
	num ans={1,0};
	while(b){
		if(b&1) ans=mul(ans,a,p);
		a=mul(a,a,p);
		b>>=1;
	}
	return ans.x%p;
}
inline long long lrd(ULL n,ULL p){
	if(ksm(n,(p-1)<<1,p)==p-1) return -1;
	ULL a;
	do{
		a=rand()%p;
		w=(a*a-n)%p;
	}while(ksm(w,p>>1,p)!=p-1);
	num x={a,1};
	return powi(x,(p+1)>>1,p);
}
int main(){
	register unsigned int TTT=fastread();
	while(TTT--){
		register ULL n=ftread(),p=ftread();
		n%=p;
		if(n){
			register long long ans1=lrd(n,p);
			if(ans1==-1) printf("Hola!\n");
			else{
				register long long ans2=((p-ans1)%p+p)%p;
				if(ans1<ans2) printf("%lld %lld\n",ans1,ans2);
				else if(ans2<ans1) printf("%lld %lld\n",ans2,ans1);
				else printf("%lld\n",ans1);
			}
		}
		else printf("0\n");
	}
	return 0;
}

我也不知道哪里错了,就是全WA

2021/6/18 21:50
加载中...