题目来源: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;
}