【数论】等差数列求和公式
// (a1 + an) * n / 2 = x an = a1 + n - 1
// (2a1 + n - 1) * n = x * 2 所以将2*x进行因数分解得到i和j
// 2a1 + n - 1 = i && n = j
// 2a1 + j - 1 = i;
// a1 = (i - j + 1) / 2; 验证a1是否成立即可
class Solution {
public int consecutiveNumbersSum(int n) {
// (a1 + an) * (an - a1 + 1) / 2 = x
// (a1 + an) * (an - a1 + 1) = 2 * x
// (2a1 + n - 1) * n / = 2 * x
// 2a1 + n - 1 = i && n = j
// 2a1 + j - 1 = i;
// a1 = (i - j + 1) / 2;
int ans = 0;
n <<= 1;
int m = (int)Math.sqrt(n);
for(var i = 1; i <= m; i++){
if(n % i == 0){
int j = n / i;
if((j - i + 1) % 2 == 0) ans++;
}
}
return ans;
}
}