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;
}