切換
舊版
前往
大廳
主題

ZeroJudge - d756: 10290 - {Sum+=i++} to Reach N 解題心得

Not In My Back Yard | 2018-12-13 23:46:06 | 巴幣 2 | 人氣 243

題目連結:


題目大意:
已知所有的非負整數可以被連續的非負整數之和所表示。例如9可以表示為
2 + 3 + 4 、 4 + 5 、 9 ,共三種表示法。

現給定一非負整數 N ( 0 ≦ N ≦ 9 * 10 ^ 14 ),求 N 可被多少組的連續非負整數之和所表示。



範例輸入:
9
11
12


範例輸出:
3
2
2



解題思維:
首先,我們可以觀察級數:
a + …… + b = N 
→ (b - a + 1) × (b + a) ÷ 2 = N

而上式不管 a 、 b 之奇偶性為何, (b - a + 1) 跟 (b + a) 必為一奇一偶。因此把 N 作因數分解,求出一個 N 的奇因數(偶因數也可以),就會得到一組(a, b)。

所以,我們只要尋找 N 的奇因數個數即可(不求偶因數是因為奇因數的數量比較好求)。而奇因數的個數可以由相異質因數( 2 除外)的次方 + 1 之彼此的乘積而得到。例如: 45 = 3 ^ 2 × 5,所以奇因數個數 = (2 + 1) × (1 + 1) = 6。

但是因為題目要求為連續非負整數之和,所以 0 也算在內。而會用到 0 的情況只有 0 + 1 + 2 + …… + x = N 。於是,我們要額外判斷是否存在一非負整數 x 使得
x × (x + 1) ÷ 2 = N 。

而上式成立時, x 之值為 floor(sqrt(2N)),也就是 2N 取平方根之值再無條件捨去。因此,反過來先把 x 設為 floor(sqrt(2N)),然後驗證 x × (x + 1) ÷ 2 是否 = N。如果成立,那麼除了我們求出的奇因數之數量,方法數還要再 + 1 。

最後,記得最佳化輸出、輸入


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

創作回應

更多創作