题意:x+y=a lcm(x,y)=b 求x,y
12WCases + b 10^9 + a 10^4
所以肯定不是枚举……肯定是公式题
接下来就是转化
x+y=a
x*y/gcd(x,y)=b
令gcd(x,y)=c
x=i*c,y=j*c
i*c+j*c=a
c*i*j=b
c*(i+j)=a
c*i*j=b
因为i j互质 所以gcd(a,b)=c=gcd(x,y) 【最重要的条件】
i+j=a/c
i*j=b/c
i+b/(c*i)=a/c
c*i2-a*i+b=0
a.b.c已知二元一次方程组求根 小的那个为i 大的为j
最后因为求根时整除可能会出现小数,这是不满足题意的 ,丢掉这种情况即可
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
typedef long long ll;
ll gcd(ll a,ll b){
return b==0?a:gcd(b,a%b);
}
int main(){
ll a,b;
while(~scanf("%lld %lld",&a,&b)){
ll c=gcd(a,b);
ll d=a*a-4*b*c;
if(d<0){
puts("No Solution");
continue;
}
ll i=(a-sqrt(d))/2/c;
ll j=a/c-i;
ll x=i*c;
ll y=j*c;
if(x*y/c==b)
printf("%lld %lld\n",x,y);
else puts("No Solution");
}
}