题目:
UVA11889
题意:
已知两个数A和C,求一个最小的整数B使得LCM(A,B) = C
方法:
记GCD(A,B) = K,则A = a * K, B = b * K, C = a * b * K
所以B = C / A * K,当K = 1 时取最小
可由于此时求得的B = C / A 可能与 A 存在公约数,即假设的K = 1不成立(如(12,36))时,
需要将此时的GCD(A,B)从A,B,C中约去,即提取出了K的一部分,然后同上继续循环直至GCD(A,B)= 1
测试数据
1
12 36
#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<string>
#include<algorithm>
#include<climits>
#include<cstdlib>
using namespace std;
int gcd(int a, int b)
{
return (a % b)? gcd(b, a%b):b;
}
int main()
{
int t;
scanf("%d", &t);
while ( t-- )
{
long long a, b;
scanf("%lld%lld", &a, &b);
if ( b % a ) {
printf("NO SOLUTION\n");
continue;
}
int aa = a, bb = b / a;
int k = 1;
while ( gcd(aa, bb) != 1 )
{
k *= gcd(aa, bb);
aa = a / k;
bb = b / a ;
}
printf("%d\n", bb * k);
}
return 0;
}