推导
令 d = gcd ( x , y ) , x = p d , y = q d , z = p q d 3 d=\gcd(x,y),x=pd,y=qd,z=pqd^3 d=gcd(x,y),x=pd,y=qd,z=pqd3
∵ gcd ( p , q ) = 1 \because \gcd(p,q)=1 ∵gcd(p,q)=1
∴ gcd ( p 2 , q ) = 1 \therefore \gcd(p^2,q)=1 ∴gcd(p2,q)=1
∴ d 2 = gcd ( p 2 d 2 , q d 2 ) = g c d ( x 2 , z x ) \therefore d^2=\gcd(p^2d^2,qd^2)=gcd(x^2,\frac z x) ∴d2=gcd(p2d2,qd2)=gcd(x2,xz)
∴ d = gcd ( x 2 , z x ) \therefore d=\sqrt{\gcd(x^2,\frac zx)} ∴d=gcd(x2,xz)
∴ y = z x d = z x gcd ( x 2 , z x ) \therefore y=\frac z{xd}=\frac{z}{x\sqrt{{\gcd(x^2,\frac zx)}}} ∴y=xdz=xgcd(x2,xz)z
code
#include<bits/stdc++.h>
#define fre(x) freopen(#x".in","r",stdin),freopen(#x".out","w",stdout)
#define LL long long
using namespace std;
LL gcd(LL a,LL b){return b?gcd(b,a%b):a;}
int main(){
int T;LL x,z,Gcd,y;
scanf("%d",&T);
while(T--){
scanf("%lld%lld",&x,&z);
y=z/x/(LL)(sqrt(gcd(x*x,z/x)));
if(y*x*gcd(x,y)==z)printf("%lld\n",y);
else puts("-1");
}
return 0;
}