枚举c的约数b ,判断a*b/gcd(a,b)是否等于c。b不能整除c就是无解。注意会爆int
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
#include <vector>
#include <algorithm>
#define LL long long
LL gcd(LL a,LL b){
if(b==0) return a;
return gcd(b,a%b);
}
vector <LL> Div;
int main(){
int T;
scanf("%d",&T);
while(T--){
LL a,b;
scanf("%lld%lld",&a,&b);
if(b%a!=0) printf("NO SOLUTION\n");
Div.clear();
for(LL i=1;i*i<=b;i++){
if(b%i==0){
Div.push_back(i);
if(i!=b/i) Div.push_back(b/i);
}
}
sort(Div.begin(),Div.end());
for(int i=0;i<Div.size();i++){
LL t=Div[i];
if(a*t/gcd(a,t)==b){
printf("%lld\n",t);
break;
}
}
}
return 0;
}