这个题解利用了数学和因数分解的方法来解决问题。首先,题解考虑了将输入的 n 扩大两倍至 2*n,并试图分解这个数字的所有因数。解题核心在于分解出所有可能的因数组合,并从中判定那些因数可以通过一个特定的公式来表示连续整数之和等于原始的 n。通过一种深度优先搜索的方式,生成 2*n 的所有因数,然后对这些因数进行检查,看它们是否能形成连续整数序列的和。具体来说,如果某个因数 x 使得 (2*n // x - x) 是奇数,那么这个 x 可以构成一个解。这是因为可以通过解方程组得出连续整数的起点和终点来检查 x 是否为有效因数。
时间复杂度: O(sqrt(K)),其中 K = 2*n
空间复杂度: O(sqrt(K) + log(K))
import copy
import collections
class Solution:
def consecutiveNumbersSum(self, n: int) -> int:
prime_factors = collections.defaultdict(int) # 存储所有质因数
K = 2 * n
b = 2
while b ** 2 <= K:
if not K % b:
prime_factors[b] += 1
K //= b
else:
b += 1
prime_factors[K] += 1 # 最后剩下的K是2N的最大质因数
factors = [] # 存储所有因数
def traceback(component, prime_factors):
if not prime_factors:
factors.append(component) # 记录因数
else:
dic = copy.deepcopy(prime_factors)
item = dic.popitem() # 取出一个质因数
for i in range(item[1] + 1):
traceback(component * item[0] ** i, dic)
traceback(1, prime_factors)
res = 0
for factor in factors:
if factor ** 2 < 2 * n and ((2 * n) // factor - factor) % 2:
res += 1
return res