#Gemini's code import sys def solve(): N = int(sys.stdin.read()) primes = [] primes_append = primes.append # メソッド参照をローカル変数にキャッシュ is_prime = bytearray([1]) * (N + 1) mu = bytearray([0]) * (N + 1) mu[1] = 2 # i = 2 (唯一の偶数の素数) の初期処理 primes_append(2) if N >= 4: is_prime[4] = 0 mu[4] = 1 for i in range(3, N + 1): # 1. 偶数のショートカット処理 # i が偶数の場合、線形篩では最初の p=2 で必ず i % 2 == 0 となり break します。 # したがって inner loop を回す必要すらなく、直接 2*i だけ処理して continue できます。 if i & 1 == 0: idx = i << 1 if idx <= N: is_prime[idx] = 0 mu[idx] = 1 continue # 2. 奇数の処理 if is_prime[i]: primes_append(i) # mu[i] は bytearray の初期値 0 (=-1) のままでよいため代入を省略 # 内側ループで毎回 mu[i] を bytearray から読み出すのを防ぐためキャッシュ mu_i = mu[i] for p in primes: idx = i * p if idx > N: break is_prime[idx] = 0 if i % p == 0: mu[idx] = 1 break mu[idx] = 2 - mu_i print(sum(mu) - N) if __name__ == '__main__': solve()