UVa - 11889
已知 A,C,求最小的 B使得 LCM(A, B) = C
首先如果 A不能整除 C,则无解
由
lcm(A,B)=C=A∗Bgcd(A,B)
得
CA=Bgcd(A,B)
设
gcd(A,B)=D
,
A=A′∗D
,
B=B′∗D
,其中
A′
与
B′
互质
此时我们已知
A
,即
要求得
B
,即将
方法就是求得
D′=gcd(A′∗D,B′)
1) 如果
D′=1
,说明
A′∗D
与
B′
已经互质了,那么就认为
D=1
,将
A′∗D
看作
A′
2) 如果此
D′≠1
,那么将
B′∗D′
,
A′∗DD′
,迭代直至
D′=1
#include <cstdio>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <map>
#include <set>
#include <queue>
using namespace std;
typedef pair<int,int> Pii;
#define MST(a,b) memset(a,b,sizeof(a))
#define CLR(a) MST(a,0)
#define LL long long
#define ULL unsigned long long
int maxx(int a,int b){return a>b?a:b;}
int minn(int a,int b){return a<b?a:b;}
int abss(int a){return a<0?(-a):a;}
int GCD(int a,int b){return b?GCD(b,a%b):a;}
int A,C;
int main()
{
int T;
scanf("%d", &T);
for(int ck=1; ck<=T; ck++)
{
scanf("%d%d", &A, &C);
if(C%A){puts("NO SOLUTION");continue;}
else
{
int B=C/A;
int D;
while((D=GCD(B,A))!=1)
{
B*=D;
A/=D;
}
printf("%d\n", B);
}
}
return 0;
}