esc to dismiss
x

信息

题解

根据等差数列的公式, 可以得到以下推导,
假定起始项为\(a\), 差\(d\)为1 项数\(k\), 和为\(n\), 则
$$
n = \frac{k \times (a+a+(k-1))}{2}
$$

等式变化可以得到

\[ \begin {align} n &= \frac{k \times (a+a+(k-1))}{2} \Rightarrow \\ \\ 2n &= k(2a+(k-1)) \Rightarrow \\ \\ \frac{2n}{k} &= 2a + k - 1 \\ \\ a &= \frac{\frac{2n}{k} - k + 1}{2} \end {align} \]

由于题目要求起始项 \(a\) 需要为正整数, 也就是\(2a + k - 1\)为正整数, 因此 2 * n % k == 0

同时有\(2a \ge 2\), 所以 \(2a + k - 1 \ge k + 1 \Rightarrow \frac{2n}{k} \ge k + 1\)

综上,
* \(k\)\(2n\)的约数, 且是较小的那个.
* 因此在\([1, \sqrt{2n}]\)的范围内找\(k\)即可.
* \(a\) 为正整数, 因此 (2n/k -k + 1) % 2 == 0

pub fn consecutive_numbers_sum(n: i32) -> i32 {
    let mut ans = 0;
    let n = 2 * n;
    let mut k = 1;

    while k * k < n {
        if n % k != 0 {
            k += 1;
            continue;
        }
        if (n / k - (k - 1)) % 2 == 0 {
            ans += 1;
        }
        k += 1;
    }
    ans
}
x