题目:Finding LCM LightOJ - 1215
题意:给你三个数 a, b, L, LCM(a, b, c) = L,让你求c.
思路:本题的思路就是求a和b的最小公倍数k,然后用L除以K就是最后的结果,但是我后来发现一个问题,如果a = 2, b = 4, L = 8的时候按照这个结果就是错的,那么我们怎么求呢?就是求出k之后,不断把k中与c中重复的部分除掉,c乘以这一部分,直到c和k之间最大公约数为1为止,这么做把k中与c中都有的部分去掉。
代码:
#include<stdio.h>
using namespace std;
#define LL long long
LL gcd(LL a, LL b)
{
if(!b)return a;
else return gcd(b, a%b);
}
int main()
{
int T;
scanf("%d", &T);
int ca= 0;
while(T--)
{
LL a, b, L;
scanf("%lld %lld %lld", &a, &b, &L);
LL t = gcd(a, b);
LL k = a/t*b;
printf("Case %d: ", ++ca);
if(L % k == 0)
{
LL ans = L / k;
while(1)
{
LL g = gcd(ans, k);
if(g == 1)break;
ans *= g;
k /= g;
}
printf("%lld\n", ans);
}
else printf("impossible\n");
}
return 0;
}