E - 2^a b^2 Editorial by toam


この問題の難しいところは,\(n = 2^a b^2\) を満たす \((a, b)\) が複数存在するような \(n\) があるため,重複して数えるのを避ける工夫が必要であるという点です.公式解説では \(a=1,2\) に限定することで重複を避けて数えています.

これとは別に,「\(b\)奇数」という条件を加えることでも重複を避けることが可能です.

良い整数は正整数 \(a\) および正の奇数 \(b\) を用いてただ一通りに \(2^a b^2\) とあらわすことが可能なことが証明できます.よって,\(2^ab^2\leq N\) を満たす正整数 \(a\) および正の奇数 \(b\) の組の個数を数えられれば良いです.\(a\) を固定すると \(b\leq \sqrt{N/2^a}\) となるため,これを満たす正の奇数 \(b\) の個数は \(\left\lfloor\dfrac{\sqrt{N/2^a}+1}{2}\right\rfloor\left(=\left\lfloor\dfrac{\lfloor\sqrt{N/2^a}\rfloor+1}{2}\right\rfloor\right)\) です.この値を \(a=1,2,\ldots,\lfloor\log_2 N\rfloor\) に対して求め,それらを足し合わせることで答えを求めることができます.

from math import isqrt
N = int(input())
ans = 0
for a in range(1, 61):
    ans += (isqrt(N // (2**a)) + 1) // 2
print(ans)

posted:
last update: