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

 

传送门

•题意

一直整数$a,b$,有

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

求$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\{\begin{matrix}
x+y=p*g+q*g=(p+q)g=a\\
LCM(x,y)=\frac{xy}{g}=p*q*g=b
\end{matrix}\right.$

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

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

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

然后解方程组就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\n",min(x,y),max(x,y));
21         else
22             puts("No Solution");
23     }
24 }
View Code

 

 

 

 

posted @ 2019-11-03 10:36  MMMinoz  阅读(151)  评论(0编辑  收藏  举报