切換
舊版
前往
大廳
主題

ZeroJudge - e626: 11254 - Consecutive Integers 解題心得

Not In My Back Yard | 2020-02-01 02:05:01 | 巴幣 0 | 人氣 218

題目連結:


題目大意:
輸入有多列,每列給定一正整數 n (n ≦ 10 ^ 9,n = -1 時代表輸入結束)。請找到連續正整數數列,其總和為 n 。如果有多組數列,請輸出含有最多數字的(數列最長的)那一組。

例如 n = 15 ,則有 1 + ...  + 5 、4 + ... + 6 、 7 + ... + 8 、 15 + ... + 15 這四種。(輸出格式即是前面列舉的形式)數字最多的是第一種,因此所求為 1 + ...  + 5 。



範例輸入:
8
15
35
-1


範例輸出:
8 = 8 + ... + 8
15 = 1 + ... + 5
35 = 2 + ... + 8


解題思維:
假設連續正整數的上界、下界分別為 X 、 Y ,則 n = Y + ... + X 。

改寫上式可以變成
(X - Y + 1)×(X + Y)= 2n
並假設 a = X - Y + 1 、 b = X + Y ,此題於是變成了找 2n 的因數。而原本的 X = (b + a - 1) ÷ 2 、 Y = (b -  a + 1) ÷ 2 。

而為了要找到有最多數字的數列 Y + ... + X ,因此要最大化 X - Y + 1 的值。根據上面的假設,此即為 a 。

而觀察原式(X - Y + 1)×(X + Y)可以發現 a 、b 兩者必定一奇一偶且 b > a 。因此可以用這些條件來找到 a :
首先令 a = √(2n) 取整數,從此開始找起。令 b = 2n ÷ a (一樣取整數)。如果 a × b ≠ 2n ,則將 a 往下修(將 a 減去 1);如果 a 、 b 的奇偶性相同,則同樣也將 a 往下修。

當找到a 、 b 滿足 a × b = 2n 且兩者一奇一偶時,此時的 a 即是最大的可能值。代回原式即可得出原本的 X 、 Y ,此即所求。

此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

相關創作

更多創作