[数论] 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了
•代码
View Code1 #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 }