Given two positive integers a and b,find suitable X and Y to meet the conditions: X+Y=a Least Common Multiple (X, Y) =b
6 8 798 10780
No Solution 308 490
这题算是到数学水题,然而自己嘿嘿嘿嘿没做出来,很尴尬。
思路:
假设gcd(x,y)=l
则
i*l+j*l==a
i*j*l==b
因为i和j此时互质
所以 i+j 和 i*j 也互质
所以gcd(a,b)==l==gcd(x,y)
联立
i+j=a/l
i*j=b/l
连立解这个方程组。
上代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
long long gcd(long long x, long long y)
{
return y==0 ? x : gcd(y, x%y);
}
int main()
{
long long a,b,x,y,i,j,l;
while(scanf("%I64d %I64d", &a, &b)!=EOF)
{
l = gcd(max(a,b),min(a,b));
long long a_l = a/l;
long long b_l = b/l;
long long daierta = a_l*a_l - 4 * b_l;
if(daierta<0)
{
printf("No Solution\n");
continue;
}
long long gen = sqrt(daierta*1.0);
if(gen*gen != daierta)
{
printf("No Solution\n");
continue;
}
i = (a_l - gen) / 2;
j = (a_l + gen) / 2;
if(i*2 != (a_l - gen) || j*2 != (a_l + gen) || i<=0 || j<=0)
{
printf("No Solution\n");
continue;
}
printf("%I64d %I64d\n",min(i,j)*l, max(i,j)*l);
}
return 0;
}
水波。