题目简析
题意
LCM(A,B)=C即A和B的最小公倍数是C,根据输入的A和C,若存在B则输出B的最小值,否则输出“NO SOLUTION”。
思路
最大公约数(gcd)
(1)
int gcd(int a,int b){
return a%b==0?b:gcd(b,a%b);
}
(2)
int gcd(int a,int b){
return b==0?a:gcd(b,a%b);
}
最大公约数(gcd)与最小公倍数(lcm)的关系
a×b=lcm(a,b)×gcd(a,b)
在本题中
A×B=C×gcd B=C×gcd÷A
gcd是A中质因子中的一个,枚举A中的所有质因子z,令B=C÷A×z,
满足A×B==C×gcd条件的B即为所求。
代码(参照学习博客)
#include<stdio.h>
#include<math.h>
using namespace std;
long long gcd(long long a,long long b){//求a和b的最大公约数
return a%b==0?b:gcd(b,a%b);
}
int main(){
long long z[10000],zs,i,j;
int n;
scanf("%d",&n);
while(n--){
long long a,b,c;
scanf("%lld%lld",&a,&c);
if(c%a){//当c不是a的最小公倍数时
printf("NO SOLUTION\n");
continue;
}
long long cc=c;
c=c/a;
long long x=(long long)sqrt(a);
zs=0;
for(i=1;i<=x;i++)//一个因数大于根号a,另一个必定小于根号a
if(a%i==0)
{
z[++zs]=i;//两个因数
z[++zs]=a/i;
}
long long Ans=-1;
for(j=1;j<=zs;j++){
b=c*z[j];
if(a*b/gcd(a,b)==cc){
Ans=b;
break;
}
}
if(Ans==-1)
printf("NO SOLUTION\n");
else
printf("%d\n",Ans);
}
return 0;
}