#include<cstdio>
#define int long long
using namespace std;
int x,z,t;
int gcd(int a,int b){
if(!b)
return a;
return gcd(b,a%b);
}
inline int read()
{
int x=0,f=1;char c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
return x*f;
}
bool flag;
signed main(){
scanf("%lld",&t);
while(t--){
flag=0;
x=read();z=read();
for(int i=1;i*i<=x;i++){
if(x%i==0){
int y1=z/(x*i);
int y2=z/(x*(x/i));
if(x*y1*gcd(x,y1)==z){
flag=1;
printf("%lld\n",y1);
break;
}
else if(x*y2*gcd(x,y2)==z){
flag=1;
printf("%lld\n",y2);
break;
}
}
}
if(!flag)
printf("-1\n");
}
return 0;
}
评测记录
这种做法直接找到合法就输出不会不能保证y最小吗
如果直接输出y1可能会出现后面有比他小还合法的吗
什么情况会出现多个合法的y