有名問題
問題はこちら
問題概要
を求めよ.解説1
答えはの領域内の格子点の数となります.(上の格子点の数はになるため)この領域はに関して対称であるための領域内の格子点を数えて2倍します.
となり,これを2倍すると
となります.上の個の格子点が2回数えられているのでを引いて
が答えになります.
以下の領域を2倍して,2回カウントされた正方形領域の個の格子点を引くと考えてもいいです.
解説2
となるの範囲がであるとします.かつであるので,以下のアルゴリズムにより計算できます.- の間以下を繰り返す.
からが同じ値になる区間を調べていくような感じです.
- のとき
としてあり得る値は個です(そもそも範囲がなので).
- のとき
なのでとしてあり得る値は個です.
したがって,このアルゴリズムの計算量はです.
提出プログラム
解説1N = int(input()) M = int(N ** 0.5) ans = 0 for i in range(1,M+1): ans += N//i ans = 2*ans - M**2 print(ans)
解説2
N = int(input()) ans = 0 L = 1 while L <= N: R = N // (N // L) ans += (R - L + 1) * (N // L) L = R + 1 print(ans)