UVa11889

来源:互联网 发布:java小数点后两位 编辑:程序博客网 时间:2024/06/05 16:52

题目链接

简介:
给出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;}