简介:
给出A,C,找出最小的C使得lcm(A,B)=C
分析:
这道题看上去很简单,稍微搞一搞就好了
但是我们要找到一个优美至极的方法
这次我们要从我们最常用的求lcm的柿子开始
lcm(a,b)=a*b/gcd(a,b)
b=lcm(a,b)*gcd(a,b)/a
lcm(a,b)/a我们知道,那现在的问题就是gcd(a,b)是多少
设d=lcm(a,b)/a=c/a
(当a,b互质的时候,b=d)
设r=gcd(a,d)
当r!=1时,说明a,b不互质
b*=r , a/=r
//这里写代码片
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int gcd(int a,int b)
{
int r=a%b;
while (r)
{
a=b;
b=r;
r=a%b;
}
return b;
}
int main()
{
int a,c;
int T;
scanf("%d",&T);
while (T--)
{
scanf("%d%d",&a,&c);
if (c%a!=0)
{
printf("NO SOLUTION\n");
}
else
{
int d=c/a;
int b=1;
int r=gcd(a,d);
while (r!=1)
{
a/=r;
b*=r;
r=gcd(a,d);
}
b*=d;
printf("%d\n",b);
}
}
return 0;
}