""" The sequence of triangle numbers is generated by adding the natural numbers. So the 7th triangle number would be 1+2+3+4+5+6+7=28. The first ten terms would be: 1, 3, 6, 10, 15, 21, 28, 36, 45, 55, ... Let us list the factors of the first seven triangle numbers: 1 : 1 3 : 1, 3 6 : 1, 2, 3, 6 10 : 1, 2, 5, 10 15 : 1, 3, 5, 15 21 : 1, 3, 7, 21 28 : 1, 2, 4, 7, 14, 28 We can see that 28 is the first triangle number to have over five divisors. What is the value of the first triangle number to have over five hundred divisors? NOTE: -> in Math 解法的核心是找到所有质因数及对应的最大幂, 根据组合数学的方法估算因数数量 -> in Coding 循环遍历 """ import math import time def timer(func): def wrapper(*args, **kwargs): start_time = time.time() result = func(*args, **kwargs) end_time = time.time() print(f"Time taken: {end_time - start_time} seconds") return result return wrapper def get_factors(n): if n == 0: raise ValueError("0 没有因数集合") n = abs(n) # 处理负数 factors = set() for i in range(1, int(math.isqrt(n)) + 1): if n % i == 0: factors.add(i) factors.add(n // i) return sorted(factors) def get_triangle_number(n: int) -> int: return n * (n + 1) // 2 @timer def main_coding() -> None: n = 1 while True: triangle_number = get_triangle_number(n) factors = get_factors(triangle_number) if len(factors) > 500: print(triangle_number) break n += 1 if __name__ == "__main__": main_coding()