您的位置:首页 > 其它

hdoj 5974 A Simple Math Problem

2017-09-15 21:10 260 查看
题目链接:A Simple Math Problem

题目大意:给你一个a和b,现在要求x+y = a,lcm(x,y) = b,输出x,y

题目思路:数据范围太大,暴力不可解,我们假设s=gcd(x,y) 则 i∗s+j∗s=a,(i∗s∗j∗s)/s=b即(i+j)∗s=a,(i∗j)∗s=b,易知i,j互质,故i+j与i*j互质,所以gcd(a,b)==s,这样我们就求出了s,然后i,j两个未知数,两个方程,可解,考虑一下无解和delta的情况,然后就可出了,具体看代码

#include <map>
#include <set>
#include <cmath>
#include <vector>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>

using namespace std;
typedef long long ll;

int main(){
ll a,b;
while(~scanf("%lld%lld",&a,&b)){
ll x = a/__gcd(a,b);
ll y = b/__gcd(a,b);
if(x*x-4*y < 0) puts("No Solution");
else{
ll sq = sqrt(x*x-4*y);
if(sq*sq != x*x-4*y) puts("No Solution");
else{
ll ans1 = x+sq;
ll ans2 = x-sq;
if(ans1 > ans2) swap(ans1,ans2);
if(ans1%2 == 1) puts("No Solution");
else printf("%lld %lld\n",ans1/2*__gcd(a,b),ans2/2*__gcd(a,b));
}
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: