傳送門php
•題意
已知 $a,b$,求知足 $x+y=a\ ,\ LCM(x,y)=b$ 條件的 $x,y$;c++
其中,$a,b$ 爲正整數,$x,y$ 爲整數;ide
•題解
關鍵式子:設 $a,b$ 爲正整數,若是有 $GCD(a,b)=1$,則有 $GCD(a+b,ab)=1$;spa
證實能夠看這裏【👉】;.net
令 $p=\frac{x}{GCD(x,y)}\ ,\ q=\frac{y}{GCD(x,y)}$;code
那麼,將 $p,q$ 帶入 $\begin{cases} x+y=a \\ LCM(x,y) &= \frac{xy}{GCD(x,y)} \\ &= b \end{cases}$ 得:$\begin{cases} (p+q)\cdot GCD(x,y) &= a \\ p\cdot q\cdot GCD(x,y) &=b \end{cases}$blog
即get
$\begin{cases} (p+q) &= \frac{a}{GCD(x,y)} \\ p\cdot q &=\frac{b}{GCD(x,y)} \end{cases}$it
又由於 $GCD(p,q) = 1$,因此有 $GCD(p+q,pq)=GCD( \frac{a}{GCD(x,y)}\ ,\ \frac{b}{GCD(x,y)})=1$;io
因此 $GCD(x,y)=GCD(a,b)$;
有了 $GCD(x,y)$ 的值,至關於已知 $a,b$,求知足 $x+y=a,xy=b\cdot GCD(x,y)$ 的整數解 $x,y$;
技巧,求解出 $x-y=\sqrt{(x+y)^2-4xy}$,判斷 $x-y$ 是否爲整數,若是不是,輸出 "No Solution";
•Code
View Code1 #include<bits/stdc++.h> 2 using namespace std; 3 #define ll long long 4 #define GCD(a,b) __gcd(a,b) 5 6 ll a,b; 7 8 void Solve() 9 { 10 b *= GCD(a,b); 11 ll tmp=a*a-4*b; 12 ll s=sqrt(tmp); 13 ///不用特判tmp < 0 14 ///若是 tmp < 0 , s=sqrt(tmp)=-INF 15 if(s*s != tmp || (a+s)%2 != 0) 16 return puts("No Solution"),void(0); 17 18 ll x=(a+s)/2; 19 ll y=a-x; 20 printf("%lld %lld\n",min(x,y),max(x,y)); 21 } 22 int main() 23 { 24 while(~scanf("%lld%lld",&a,&b)) 25 Solve(); 26 27 return 0; 28 }