HDU 5974"A Simple Math Problem"(GCD(a,b) = GCD(a+b,ab) = 1)

 

傳送門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

 1 #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 }
View Code
相關文章
相關標籤/搜索