题意:
已知 a,b,找出一个x 和 y 满足 x+y=a,Lcm(x,y)=b;
思路:
x + y = a;
lcm(x,y) = b;
不妨设 gcd(x,y) = k;
x = k * i;
y = k * j;
则 k * ( i + j ) = a;
lcm(x,y) * gcd(x,y) = x * y;
k * b = k * k * i * j;
所以 b = k * i * j;
因为 a = k * ( i+ j)
i * j 与 i + j 互质,所以 k = gcd(a,b);
x + y = a;
x * y = b*k;
一元二次方程,
x + y = - (b/a);
x *y = c / a;
x * x - b* x + b*k = 0 解这个方程就好了。
#include <bits/stdc++.h>
#define mem(x,v) memset(x,v,sizeof(x))
#define go(i,a,b) for (int i = a; i <= b; i++)
#define og(i,a,b) for (int i = a; i >= b; i--)
using namespace std;
typedef long long LL;
const double EPS = 1e-10;
const int INF = 0x3f3f3f3f;
const int N = 1e5+10;
LL gcd(LL a, LL b){
if (b == 0) return a; else return gcd(b,a%b);
}
int main(){
LL a,b,k;
while(scanf("%lld%lld",&a,&b) != EOF){
k = gcd(a,b);
LL p =(LL)(a*a-4*k*b);
if (p < 0) printf("No Solution\n"); else{
LL x = (LL)((a+sqrt(p))/2);
LL y = a - x;
if (x*y==b*gcd(x,y)) printf("%lld %lld\n",y,x); else
printf("No Solution\n");
}
}
return 0;
}