考え方
$1\leq n \leq N$を満たす$n$の約数はそれぞれ$O(\sqrt{n})$で求められる(Pythonで蟻本2-6 - 数学的な問題を解くコツ - 競プロはじめました).よって,$1\leq n \leq N$なるすべての$n$に対して約数を調べる計算量は$O(N\sqrt{N})$で抑えられる.$AB$を$1\sim N$に対して全て調べるとき,
- $A, B$は$AB$の約数の組
- $C, D$は$N - AB$の約数の組
回答例
約数の組$(x, y)$が$x \neq y$なら,$A, B = (x, y), (y, x)$の2通りあるが,$x=y$なら$A, B = (x, y = x)$の1通りであることに注意する.N = int(input()) ans = 0 memo = {} for n in range(1, N): i = 1 tmp = set() while i * i <= n: if n % i == 0: tmp.add((i, n // i)) i += 1 memo[n] = tmp num = {n:0 for n in range(1, N)} for n in range(1, N): tmp = memo[n] for x, y in tmp: if x != y: num[n] += 2 else: num[n] += 1 for AB in range(1, N): ans += num[AB] * num[N - AB] print(ans)