题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=5974
题目大意:
给你a和b,让你求出X和Y,使得X + Y = a lcm(x,y) = b
题目思路:
看数据范围肯定不能进行暴力枚举了!
令gcd(x,y) = g;
那么
g * k1 = x;
g * k2 = y;
因为g 是最大公约数,那么k1与k2 必互质!
=> g*k1*k2 = b
=> g*k1 + g * k2 = a;
这样两个式子就可以化成一元二次方程,这样就可以求解相应的值,只需要判断方程是否有解以及得出来的值是否为整数即可。
学到的东西:
运用gcd的关系与性质,进行式子的变形。
代码:
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const double eps = 1e-8;
ll gcd(ll a,ll b)
{
if(b==0) return a;
return gcd(b,a%b);
}
int main()
{
ll a,b;
while(~scanf("%lld%lld",&a,&b)){
ll g=gcd(a,b);
double dit = a*a-4*(-g)*(-b);
if(dit<0) printf("No Solution\n");
else{
double k1 = ((-a)+sqrt(dit) )/(2*(-g));
double k2=(a/g - k1);
if(k1-(int)k1<eps){
if(g*k1<=0||g*k2<=0) printf("No Solution\n");
else printf("%lld %lld\n",g*(ll)k1,g*(ll)k2);
}
else printf("No Solution\n");
}
}
}