HDU - 5974 A Simple Math Problem (数论解方程)

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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值