Finding LCM LightOJ - 1215(数论推导题)

题目链接

题意:给你a,b和L,求一个最小的c满足lcm(a,b,c)=L。

思路:这题很容易被误导,求出a,b的最小公倍数为m,此时相当于求lcm(m,c)=L,容易被误导以为c=L/m。实际上L/m并一定不满足lcm(m,L/m)=L。

例如lcm(12,2)!=24。因为当满足lcm(m,L/m)=L,gcd(m,L/m)一定等于1。所以有一个方法。当gcd(m,L/m)!=1时,令x=m,y=L/m,t=gcd(m,L/m),此时y*=t,x/=t,此时x*y仍然等于L,直到最后t==1,此时y为最终答案。

#include<stdio.h>
#include<math.h>
#include<string.h>
#include<map>
#include<vector>
#include<algorithm>
#define N 2000006
#define ll long long
#define ull unsigned long long 
using namespace std;
int main()
{
    int t;
    int u=0;
    scanf("%d",&t);
    while(t--)
    {
        ll a,b,c;
        scanf("%lld%lld%lld",&a,&b,&c);
        ll d=__gcd(a,b);
        ll y=a*b/d;
        printf("Case %d: ",++u);
        if(c%y==0)
        {
            ll sum=c/y;
            ll r=__gcd(sum,y);
            while(r!=1)
            {
                sum*=r;
                y/=r;
                r=__gcd(sum,y);
            }
            printf("%lld",sum);
        }
        else
        printf("impossible");
        printf("\n");
     }  
}

 

posted @ 2020-09-18 16:14  Ldler  Views(116)  Comments(0Edit  收藏  举报