《編》書2.21題。
4 + 5 = 9
2 + 3 + 4 = 9
有些數比如 4 和 8 不能分拆寫成連續自然數的和。這裡面有什麼規律呢?如果用程序的思路來寫,顯然可以使用蠻力窮舉可以求解。
這裡面有兩個信息:“連續” 和 “求和”。
我們先看最簡單情況,兩個連續自然數相加。其和必為奇數,故偶數必不可以寫成兩個連續自然數相加。而所有的奇數(2n+1)都可以寫成兩個連續自然數相加,有且只有n, n+1這兩個數才滿足。
我們由此想到,要將一個數寫成m個連續自然數之和,這些數只能聚集在floor(1/m)處,並在該處左右各取數字,來彌補偏差。
而一個數 x 最多可以寫成多少個連續自然數之和呢?只能從1開始取。我們有了1+...+m = x這個熟悉的式子。所以知道m最多是floor((sqrt(8x+1)-1)/2)。
而且我們還知道,如果一個數能寫成奇數個(假設為m)連續自然數相加的話,那該數必被m整除,即..., n-2, n-1, n, n+1, n+2, ...之和為 m*n,易知x % m = 0。
那偶數(m>2)的情況呢?
同理,n, n+1, n+2, ... 之和為m*n+ m*(m-1)/2,則x % m = m/2。推導如下:
x % m
= (m*n + m²/2 - m/2) % m
= (m²/2) % m - (m/2) % m
= (m * (m/2)) % m - (m/2) % m
= m/2 % m
= m/2
至此,我們可以用o(1)的方法驗證一個自然數是否可以寫成任意m個連續自然數的和了。