#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