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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值