题目:
已知X+Y=a,LCM(X,Y)=b,求X,Y
a(1≤a≤2*10^4),b(1≤b≤10^9),数据组数T<12W
分析:
看数据组数这么大,一定是公式题
首先有结论:gcd(x,y)=gcd(a,b)
证明如下:
于是我们有方程组:
X+Y=a
XY=b*gcd(a,b)
解二元一次方程组,利用求根公式得到解,其中delta<0无解,而且开方时开出非整数或者最后的结果为非整数都不符合题意。
代码:
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
long long int a,b,g,delta,x,y;
long long int gcd(long long int a,long long int b)
{
return b==0?a:gcd(b,a%b);
}
int main()
{
while(scanf("%lld %lld",&a,&b)==2)
{
g=gcd(a,b);
delta=a*a-4*b*g;
if((delta<0)||((long long)sqrt(delta)*(long long)sqrt(delta)!=delta)) printf("No Solution\n");
else {
y=(a+(long long)sqrt(delta))/2;
x=(a-(long long)sqrt(delta))/2;
if((x*y!=b*g)||(x+y!=a)) printf("No Solution\n");
else printf("%lld %lld\n",x,y);
}
}
return 0;
}