[数论] hdu 5974 A Simple Math Problem (数论gcd)

传送门

•题意

一直整数$a,b$,有

$left{egin{matrix}
x+y=a\
LCM(x*y)=b
end{matrix} ight.$

求$x,y$

•思路

解题重点:若$gcd(p,q)=1$,则$gcd(p+q,pq)=1$

设$gcd(x,y)=g$,令$p=frac{x}{g},q=frac{y}{g}$,$p,q$互素

则$left{egin{matrix}
x+y=p*g+q*g=(p+q)g=a\
LCM(x,y)=frac{xy}{g}=p*q*g=b
end{matrix} ight.$

由于$p,q$互素,所以$gcd(a+b,ab)=gcd((p+q)*g,pqg)=g$

所以的$gcd(x,y)=g=gcd(a+b,ab)$

$left{egin{matrix}
x+y=a\
xy=bgcd(a,b)
end{matrix} ight.$

然后解方程组就ok了,

不过要注意输出$x,y$先后顺序

小的在前,大的在后,虽然题目里没说,但因为这wa了

•代码

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define ll long long
 4 ll x,y,a,b;
 5 int main()
 6 {
 7     while(~scanf("%lld%lld",&a,&b))
 8     {
 9         bool flag=true;
10         ll gcd=__gcd(a,b);
11         ll ssub=a*a-4*b*gcd;
12         ll sub=sqrt(ssub);
13         if(ssub!=sub*sub)
14             flag=false;
15         if((a+sub)%2)
16             flag=false;
17         x=(a+sub)/2;
18         y=a-x;
19         if(flag)
20             printf("%lld %lld
",min(x,y),max(x,y));
21         else
22             puts("No Solution");
23     }
24 }
View Code
原文地址:https://www.cnblogs.com/MMMinoz/p/11785359.html