题意:
给你A,C,让你求lcm(A,B)=C的最小B。
思路:
首先,若C%A!=0那么C肯定不是A的倍数,这种情况排除。若C%A=0,由C=A*B/gcd(A,B)可知,B/gcd(A,B)肯定是个整数,那么当gcd(A,B)=1时B最小这时由A*B/1=C得B=C/A,所以先判断下是否gcd(A,C/A)=1,是直接输出C/A,否则就枚举C/A的倍数(因为gcd(A,B)肯定是个整数)去判断lcm(A,C/A*i)=C?
#include<cstdio>
typedef long long LL;
LL A,C;
LL gcd(LL a,LL b){
return b==0?a:gcd(b,a%b);
}
LL lcm(LL a,LL b){
return a*b/gcd(a,b);
}
bool ok(LL B){
if(A>B) return lcm(A,B)==C?true:false;
else return lcm(B,A)==C?true:false;
}
int main(){
int T;
scanf("%d",&T);
while(T--){
scanf("%lld%lld",&A,&C);
if(C%A==0){
if(gcd(A,C/A)==1) printf("%lld\n",C/A);
else{
for(LL i=2;i<=A;i++){
if(ok(i*(C/A))){
printf("%lld\n",i*(C/A));
break;
}
}
}
}
else printf("NO SOLUTION\n");
}
return 0;
}