HDU5974 A Simple Math Problem---数论--转化解方程

Posted kimsimple

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU5974 A Simple Math Problem---数论--转化解方程相关的知识,希望对你有一定的参考价值。

感谢:http://blog.csdn.net/mirror58229/article/details/63685884

题意:x+y=a lcm(x,y)=b  求x,y

12WCases +  b 10^9 + a 10^4

所以肯定不是枚举……肯定是公式题

 

接下来就是转化

x+y=a

x*y/gcd(x,y)=b

 

令gcd(x,y)=c

x=i*c,y=j*c

 

i*c+j*c=a

c*i*j=b

 

c*(i+j)=a

c*i*j=b

 

因为i j互质 所以gcd(a,b)=c=gcd(x,y) 【最重要的条件】

所以一开始就能得到c值,剩下就是求根

i+j=a/c

i*j=b/c

 

i+b/(c*i)=a/c

c*i2-a*i+b=0

a.b.c已知二元一次方程组求根 小的那个为i 大的为j

最后因为求根时整除可能会出现小数,这是不满足题意的 ,丢掉这种情况即可

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
typedef long long ll;
ll gcd(ll a,ll b)
{
    return b==0?a:gcd(b,a%b);
}
int main()
{
    ll a,b;
    while(scanf("%lld%lld",&a,&b)!=EOF)
    {
        ll c=gcd(a,b);
        ll d=a*a-4*b*c;
        if(d<0)
        {
            printf("No Solution\n");
            continue;
        }
        ll i=(a-sqrt(d))/2/c;
        ll j=a/c-i;
        ll x=c*i;
        ll y=c*j;
        if(x*y/c==b)
            printf("%lld %lld\n",x,y);
        else
            printf("No Solution\n");
    }
}

 

以上是关于HDU5974 A Simple Math Problem---数论--转化解方程的主要内容,如果未能解决你的问题,请参考以下文章

HDU - 5974 A Simple Math Problem (数论 GCD)

hdu 5974 A Simple Math Problem(数学题)

HDU 5974 A Simple Math Problem 数学题

HDU5974 A Simple Math Problem---数论--转化解方程

HDU 5974 A Simple Math Problem ——(数论,大连区域赛)

HDU 5974 A Simple Math Problem(数学解方程)——2016ACM/ICPC亚洲区大连站-重现赛(感谢大连海事大学)