http://acm.hdu.edu.cn/showproblem.php?pid=5974
给出x,y,求a,b使得a+b=x,且a和b的最小公倍数是y。
已知a+b=x,a*b/gcd(a,b)=y.并且还知道gcd(a,b)=gcd(x,y),则可以得到二元方程组,解出a和b即可,当然也可能不存在解,时间是O(1),如果是暴力做必超时。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<iomanip>
using namespace std;
int gcd(int a,int b)
{
return b?gcd(b,a%b):a;
}
int main()
{
int x,y;
while(scanf("%d%d",&x,&y)!=EOF)
{
int s=gcd(x,y);
bool flag=0;
int res=x*x-4*y*s;
if(res<0)
{
cout<<"No Solution"<<endl;
continue;
}
else
{
int t=sqrt(res*1.0);
if(t*t==res&&(x-t)%2==0)
{
cout<<(x-t)/2<<" "<<x-(x-t)/2<<endl;
}
else if(t*t==res&&(x+t)%2==0)
{
cout<<(x+t)/2<<" "<<x-(x+t)/2<<endl;
}
else
{
cout<<"No Solution"<<endl;
}
}
}
return 0;
}