求估分或hack
查看原帖
求估分或hack
253608
Tx_Lcy楼主2022/3/26 19:23
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
#define int long long
int gcd(int a,int b){return a%b==0?(b):(gcd(b,a%b));}
signed main(){
	freopen("math.in","r",stdin);
	freopen("math.out","w",stdout);
	int t;scanf("%lld",&t);
	while (t--){
		int x,z;scanf("%lld%lld",&x,&z);
		if (z%x!=0) puts("-1");
		else{
			int yy=z/x,gy=gcd(z/x,x);
			int y=yy/gy,tag=0;
			if (gcd(x,y)*x*y==z){printf("%lld\n",y);continue;}
		//	printf("%lld %lld %lld %lld %lld\n",x,y,gcd(x,y),x*y*gcd(x,y),gy);
			for (int i=2;i<=gy;i++){
				int t=0;
				while (gy%i==0){gy/=i;t++;}
				int tt=0,ys=y;
				while (ys%i==0){ys/=i;tt++;}
				if (tt<t){
					if (tt==0 && t==1){tag=1;puts("-1");break;}
					if ((t+tt)%2!=0) y*=pow(i,(t+tt+1)/2-tt);//{puts("-1");tag=1;break;}
					else y*=pow(i,(t+tt)/2-tt);
				}
			}
			if (tag) continue;
		//	printf("%lld %lld %lld %lld %lld\n",x,y,gcd(x,y),x*y*gcd(x,y),gy);
			if (gcd(x,y)*x*y!=z) puts("-1");
			else printf("%lld\n",y);
		}
	}
	return 0;
} 

大样例140ms,能过吗?

2022/3/26 19:23
加载中...