版权声明:本文为博主原创文章,转载请说明出处。 https://blog.csdn.net/xianpingping/article/details/82932547
大体题意:
给你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;
所以k1 * k2 = b / g;
k1 + k2 = a/g;
因为k1与k2 互质!
所以k1 * k2 和 k1 + k2 也一定互质(一个新学的知识点= = )
所以a/g 与b/g也互质!
那么g 就是gcd(a,b);
所以我们得出一个结论: gcd(x,y) == gcd(a,b);;
所以x + y 与 x * y都是已知的了,解一元二次方程即可!
代码:
#include<bits/stdc++.h>
#define ll long long
#define mem(a,x) memset(a,x,sizeof(a))
using namespace std;
ll gcd(ll a,ll b)
{
ll c=b;
while(a%b)
{
c=a%b;
a=b;
b=c;
}
return c;
}
int main()
{
ios::sync_with_stdio(false);
ll a,b;
while(cin>>a>>b)
{
ll k=gcd(a,b);
ll dit=(a*a)-(4*b*k);
if(dit<0)
{
cout<<"No Solution"<<endl;
}
else
{
ll x=(a+sqrt(dit))/2;
ll y=a-x;
if(x*y==b*k)
{
cout<<y<<" "<<x<<endl;
}
else
{
cout<<"No Solution"<<endl;
}
}
}
}