题意:
已知①x+y=a;②LCM(x, y)=b,给出a和b问是否有x和y满足条件(x<y)
假设x' = x/Gcd(x,y),y' = y/Gcd(x,y)那么有
暴力枚举Gcd(x, y),然后联立上面的第1个和第4个式子就可以求出x',y',乘回Gcd判断下是否合法就好
复杂度O(Tsqrt(a))
#include<stdio.h>
#include<math.h>
#include<algorithm>
using namespace std;
int Gcd(int x, int y)
{
if(y==0)
return x;
return Gcd(y, x%y);
}
int main(void)
{
int a, b, i, y, x, p, temp;
while(scanf("%d%d", &a, &b)!=EOF)
{
for(i=1;i*i<=a;i++)
{
p = i;
if(a%p==0 && b%p==0)
{
temp = sqrt(fabs(a*a/p/p-4.0*b/p))+1e-7;
y = (temp+a/p)/2;
x = a/p-y;
if(Gcd(y, x)==1 && x*p+y*p==a && x*y*p==b)
{
x *= p;
y *= p;
if(x>y)
swap(x, y);
printf("%d %d\n", x, y);
break;
}
}
p = a/i;
if(a%p==0 && b%p==0)
{
temp = sqrt(fabs(a*a/p/p-4.0*b/p))+1e-7;
y = (temp+a/p)/2;
x = a/p-y;
if(Gcd(y, x)==1 && x*p+y*p==a && x*y*p==b)
{
x *= p;
y *= p;
if(x>y)
swap(x, y);
printf("%d %d\n", x, y);
break;
}
}
}
if(i*i>a)
printf("No Solution\n");
}
return 0;
}