829. Consecutive Numbers Sum
Given an integer n, return the number of ways you can write n as the sum of consecutive positive integers.
Example 1:
Input: n = 5
Output: 2
Explanation: 5 = 2 + 3
Example 2:
Input: n = 9
Output: 3
Explanation: 9 = 4 + 5 = 2 + 3 + 4
Example 3:
Input: n = 15
Output: 4
Explanation: 15 = 8 + 7 = 4 + 5 + 6 = 1 + 2 + 3 + 4 + 5
Constraints:
- 1 < = n < = 10 9 1 <= n <= 10^9 1<=n<=109
From: LeetCode
Link: 829. Consecutive Numbers Sum
Solution:
Ideas:
-
We try every possible sequence length k (number of terms in the sequence).
-
The formula for the sum of k consecutive integers starting from x is:
n = k * x + k*(k - 1)/2 -
Rearranged:
x = (n - k*(k - 1)/2) / k -
x must be a positive integer ⇒ (n - k*(k-1)/2) % k == 0
-
The loop runs as long as the sum of the smallest k numbers (k*(k-1)/2) is less than n.
-
Time complexity is roughly O(√(2n)) since k*(k-1)/2 < n.
Code:
int consecutiveNumbersSum(int n) {
int count = 0;
// Try all possible lengths k of sequences from 1 upwards
for (int k = 1; k * (k - 1) / 2 < n; ++k) {
// Check if there exists an x such that n = k * x + k*(k-1)/2
if ((n - k * (k - 1) / 2) % k == 0)
count++;
}
return count;
}