[題解] CF 707C
Tags
- 題解
- CF
- Math
數學題。需要想,但是想出來後很好寫。
翻譯
給你一個正整數 n (n < 10^9) 求邊長全為整數,且其中一邊長度為 n 的直角三角形。
找不到時輸出 -1,存在的話輸出其餘的兩邊長(皆 < 10^18)。存在多組解時任意一組皆可。
解法
說到直角三角形,首先想到便是畢氏定理了。
aa + bb = cc
但是只有一條式子卻有三個變數,從範圍看來會枚舉到哭…
這時我們看能否將 n 定為 a 然後把 b 和 c 想辦法扯上關係。
硬扯上關係可能讓事情更複雜,但說不定會有線索。關聯性很重要。
我們知道 c > a, b 所以試著令 c = b+k
nn + bb = (b+k)(b+k)
=> nn + bb = bb + 2bk + kk
=> nn = k(2b+k)
雖然變數沒有變少,不過卻隱約看出關聯了!
到這裡可以轉成對 nn 做因數分解,找出合適的 b 和 k
不過最糟情形感覺還是太慢,但合法的 k 應該不少,
再觀察看看。
首先兩個東西相乘,會聯想到奇偶性…
2b+k 因為 2b 必為偶數,所以奇偶性完全看 k。
也就是說,k 和 2b+k 的奇偶性必定相同。
因此 n 為奇數時,k 和 2b+k 必為奇數。
又,已知當 k = 任意正奇數 v > 1 時,
若存在合法的 b > 0 滿足 nn = v(2b+v)
則比 v 小的正奇數 (例如 v-2) 也存在合法的 b
但反之可能讓 b <= 0 導致 b 不是合法邊長。
因此我們想讓 k 越小越好。
最單純的一組便是令 k = 1。2b+1 也會是奇數。
又 k=1 時,對任意奇數 n >= 3 皆可找到合法的 b。
得出 n 為奇數時 k=1 必定成立。
當 n 為偶數時,我們可以將 n 表達為 2 x i
=> nn = 2 x 2 x i x i
所以 nn 必為 4 的倍數,一定可以把 2 分成兩邊,
讓 k 和 2b+k 都是偶數。最單純的一組是 k = 2。
得出 n 為偶數時 k=2 必定成立。
最後得到:
-
奇數的情形:
令 k = 1
=> nn = 1 * (2b+1)
=> b = nn / 2 (註:nn 直接用整數除下去跟先減 1 沒兩樣)
=> c = b + 1 -
偶數的情形:
令 k = 2
=> nn = 2 * (2b+2)
=> b = nn / 4 - 1
=> c = b + 2
得出複雜度 O(1) 的方法,可以找到其中一組解。