求找错
查看原帖
求找错
200044
JS_TZ_ZHR楼主2020/11/18 22:53

RT

#include<bits/stdc++.h>
#define int long long
using namespace std;
int T,n,p,i,t;
struct node {
	int a,b;
} ans;
node Mul(node x,node y) {
	node res;
	res.a=res.b=0;
	res.a=(((x.a*y.a)%p)+((((x.b*y.b)%p)*i)%p))%p;
	res.b=(((x.a*y.b)%p)+((x.b*y.a)%p))%p;
	return res;
}
int rfpow(int x,int y) {
	cout<<x<<' '<<y<<endl;
	int res=1;
	while(y) {
		if(y&1)res=(res*x)%p;
		x=(x*x)%p;
		y>>=1;
	}
	cout<<res%p<<endl;
	return res%p;
}
int ifpow(node x,int y) {
	node res;
	res.a=1,res.b=0;
	while(y) {
		if(y&1)res=Mul(res,x);
		x=Mul(x,x);
		y>>=1;
	}
	return res.a%p;
}
signed main() {
	scanf("%lld",&T);
	while(T--) {
		scanf("%lld%lld",&n,&p);
		n%=p,t=0;
		if(!n) {
			printf("0\n");
			continue;
		}
		if(rfpow(n,(p-1)>>1)==p-1){
			printf("Hola!\n");
			continue;
		}
		while(1) {
			t=rand()%(p-1)+1;
			i=(((t*t)%p)-n+p)%p;
			if(rfpow(i,(p-1)>>1)==p-1)break;
		}
		ans.a=t,ans.b=1;
		int res1=ifpow(ans,(p-1)>>1);
		int res2=p-res1;
		printf("%lld %lld\n",min(res1,res2),max(res1,res2));
	}
}
2020/11/18 22:53
加载中...