题意:x+y=a,x和y的最小公倍数为b
找出x和y,如果没有答案就输出no solution
知道了x+y和lcm(x,y)
x*y=gcd(x,y)*lcm(x,y)=gcd(x,y)*b
x+y=a
现在如果知道了gcd(x,y),应该能很快做出来了。根据韦达定理,x和y是二元一次方程的解。
gcd(x,y)=gcd(a,b)这个就很难想了。设gcd(x,y)=g
x=k1*g;y=k2*g
a=(k1+k2)*g
b=(k1*k2)*g
(k1+k2和k1*k2是互质的,g为a和b的最大公因数)
我还是不知道为什么,k1+k2和k1*k2互质
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<set>
#include<queue>
#include<map>
using namespace std;
int gcd(int x,int y)
{
if(y==0)return x;
else return gcd(y,x%y);
}
int main()
{
int a,b,q,temp,x1,x2,g,flag;
while(scanf("%d%d",&a,&b)==2)
{
flag=1;
if(a<b)g=gcd(b,a);
else g=gcd(a,b);
b=g*b;//现在b变成了x*y
q=a*a-4*b;//一元二次方程
if(q<0)flag=0;
temp=sqrt(double(q));
if(temp*temp!=q)flag=0;//判断
x1=(a-temp)/2;
x2=(a+temp)/2;//按公式求解
if(!flag)
{
printf("No Solution\n");
}
else
{
printf("%d %d\n",x1,x2);
}
}
return 0;
}