目錄
- 2024-03-14 leetcode寫題記錄
- 829. 連續整數求和
- 題目連結
- 題意
- 解法
- 829. 連續整數求和
2024-03-14 leetcode寫題記錄
829. 連續整數求和
題目連結
829. 連續整數求和
題意
給定一個正整數\(n\),返回連續正整數滿足所有數字之和為\(n\)的組數。
示例 1:
輸入: n = 5
輸出: 2
解釋: 5 = 2 + 3,共有兩組連續整數([5],[2,3])求和後為 5。
示例 2:
輸入: n = 9
輸出: 3
解釋: 9 = 4 + 5 = 2 + 3 + 4
示例 3:
輸入: n = 15
輸出: 4
解釋: 15 = 8 + 7 = 4 + 5 + 6 = 1 + 2 + 3 + 4 + 5
解法
連續正整數之和,可以寫為\(n = \frac{r(r+1)}{2} - \frac{l(l+1)}{2}\),兩邊乘\(2\),可得
\( \begin{align} 2n &= r(r+1) - l(l+1) \nonumber \\ &= r^2 + r - l^2 - l \nonumber \\ &= (r + l + 1)(r - l) \nonumber \end{align} \)
由於以下性質:
(1)\(r+l+1\)和\(r-l\)的乘積為\(2n\);
(2)\(r+l+1\)與\(r-l\)奇偶性不同;
(3)\(r+l+1\)嚴格大於\(r-l\);
(4)任何兩個奇偶性不同的正整數\(r+l+1\)與\(r-l\),都一定有自然數\(r\)和\(l\)與其一一對應(證明很簡單,列下方程組就行)。
所以我們只需要遍歷\([1,\sqrt{2n})\),求出能整除\(2n\),且\(2n / i\)和\(i\)奇偶性不同的\(i\)的個數就行。
時間複雜度顯然為\(O(\sqrt{n})\)。
class Solution {
public:
int consecutiveNumbersSum(int n) {
int cnt = 0;
for (int i = 1; 1ll * i * i < 2 * n; ++i)
if (2 * n % i == 0 && (i ^ (2 * n / i)) & 1)
cnt++;
return cnt;
}
};