Given two positive integers a and b,find suitable X and Y to meet the conditions: X+Y=a Least Common Multiple (X, Y) =b
Input
Input includes multiple sets of test data.Each test data occupies one line,including two positive integers a(1≤a≤2*10^4),b(1≤b≤10^9),and their meanings are shown in the description.Contains most of the 12W test cases.
Output
For each set of input data,output a line of two integers,representing X, Y.If you cannot find such X and Y,output one line of "No Solution"(without quotation).
Sample Input
6 8 798 10780
Sample Output
No Solution 308 490
题意:
给出a, b,求出一组x, y使得 x + y = a 且 lcm(x, y) = b
思路:
显然不能暴力
有个结论https://blog.csdn.net/protecteyesight/article/details/72935030
大体是这样:gcd(x, y) = gcd(x + y, lcm(x, y))
下面开始列式子
a = x + y
b = lcm(x, y)
gcd(x, y) = gcd(x + y, lcm(x, y)) = gcd(a, b)
x * y = gcd(x, y) * lcm(x, y) = gcd(a, b) * b
x + y = a
联立上面加粗的这俩式子,解方程就好惹
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int inf = 0x3f3f3f3f;
const int N = 1e6 + 7;
ll gcd(ll a, ll b)
{
return b ? gcd(b, a % b) : a;
}
int main()
{
ll a = 50, b;
while(~scanf("%lld%lld", &a, &b))
{
ll t = b * gcd(a, b);
t = a * a - 4 * t;
bool flag = 1;
if(t < 0)
{
flag = 0;
}
else
{
ll tmp = sqrt(t);
if(tmp * tmp != t)
flag = 0;
else
{
ll x = a - tmp;
if(x % 2)
{
x = a - tmp;
if(x % 2)
flag = 0;
else
{
x /= 2;
cout<<x<<' '<<a - x<<'\n';
}
}
else
{
x /= 2;
cout<<x<<' '<<a - x<<'\n';
}
}
}
if(!flag)
cout<<"No Solution"<<'\n';
}
return 0;
}