🚧 This website is under construction. 🚧
AtCoder
ABC
230
E

ABC
E
整数

ABC230 E - Fraction Floor Sum

https://atcoder.jp/contests/abc230/tasks/abc230_e (opens in a new tab)
緑下位。整数問題

実は yNx (x>0,y>0)y\le \frac{N}{x} \space(x>0,y>0) の格子点の数を問われている。

上図は y=xy=x で対称なので、 yxy\ge x となる部分の格子点の個数を求めて 2 倍してやればよい。 このとき y=xy=xy=Nxy=\frac{N}{x} の交点の座標は x=nx=\sqrt{n} であり、 x(1xn)x(1\le x \le\sqrt{n}) の範囲の格子点を数え上げればよいことになる。

yNxy\le\frac{N}{x}yxy\ge x に囲まれた部分の格子点の個数は、 [Nx](x1)\left\lbrack{\frac{N}{x}}\right\rbrack - (x - 1) で求まるので、 1xn1\le x \le\sqrt{n} について計算し足し合わせる。

grid = 0
for x in range(1, int(N ** .5) + 1):
    grid += N // x - (x - 1)
 

前述の通り y=xy=x で線対称なので値を 2 倍し、重複して数えられた y=xy=x 上の格子点を除けば答えとなる。

N = int(input())
 
grid = 0
for x in range(1, int(N ** .5) + 1):
    grid += N // x - (x - 1)
 
print(grid * 2 - int(N ** .5))