•题意
一直整数$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 }
本文介绍了解决一个特定形式的方程组的方法,即求解x和y,其中x+y等于给定的a,且x和y的最小公倍数等于给定的b。通过分解方程组并利用数学性质,如互素性和最大公约数,文章提供了一种有效的方法来找到解,并给出了相应的C++代码实现。
937

被折叠的 条评论
为什么被折叠?



