题意:给你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(" "); } }