HDU - 5974

题目来源:click
题意:问x+y=a,lcm(x,y)=b,是否有两个整数x,y使之成立。
看到a,b以及测试样例的组数是不可暴力解决的,估计可以整化成一个公式。
lcm(x,y)=x*y/gcd(x,y),设gcd(x,y)=temp;
可知gcd(x/temp,y/temp)=1; 设i=x/temp,j=y/temp;
则 i * temp + j * temp=a , i * temp * j = b;
可解二元一次方程而且i,j都为正整数,temp也必为a,b的因数。
考虑到a的范围我本想再去枚举a的因数。
由于i,j互质 其实可以去证明i+j 与 i * j互质。
i + j =k1
i * j =k2
因为gcd(x+y,x)=gcd(x+y,y)=gcd(x,y)=1
(x+y)/(x * y)唯一分解定理 (x+y)/(x * y)已经是最简分数了,互质得证。
i+j 与 i * j互质,所以gcd(a,b)=gcd(x,y).

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<string>
#include<cstdlib>
#include<istream>
#include<vector>
#include<stack>
#include<map>
#include<algorithm>
#include<queue>
#define MAX_len 50100*4
using namespace std;
typedef long long  ll;
ll gcd(ll a,ll b)
{
    if(!b)
        return a;
    else
        return gcd(b,a%b);
}
int main()
{
    ll a,b,i,j;
    while(scanf("%lld %lld",&a,&b)!=EOF)
    {
        ll temp=gcd(a,b);
        a/=temp;
        b/=temp;
        ll t1=sqrt(a*a-4*b);
        if(t1*t1!=a*a-4*b||(a-t1)%2||(a+t1)%2)
        {
            printf("No Solution\n");
            continue;
        }
        printf("%lld %lld\n",(a-t1)/2*temp,(a+t1)/2*temp);
    }
    return 0;
}

发布了72 篇原创文章 · 获赞 19 · 访问量 7508

猜你喜欢

转载自blog.csdn.net/weixin_43958964/article/details/104143022
hdu