結果
| 問題 |
No.1653 Squarefree
|
| コンテスト | |
| ユーザー |
iiljj
|
| 提出日時 | 2021-08-20 22:48:05 |
| 言語 | Python3 (3.13.1 + numpy 2.2.1 + scipy 1.14.1) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 1,628 bytes |
| コンパイル時間 | 194 ms |
| コンパイル使用メモリ | 12,672 KB |
| 実行使用メモリ | 270,096 KB |
| 最終ジャッジ日時 | 2024-10-14 04:57:59 |
| 合計ジャッジ時間 | 6,754 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | -- * 3 |
| other | TLE * 1 -- * 37 |
ソースコード
from math import sqrt, pow
def Mobius(n):
prime = [1] * (n + 1)
mobius = [1] * (n + 1)
for i in range(2, n + 1):
if not prime[i]:
continue
mobius[i] = -1
for j in range(2, n // i + 1):
prime[i * j] = 0
mobius[i * j] *= -1
for j in range(1, n // (i * i) + 1):
mobius[j * i * i] = 0
return mobius
def efficient_square_free(N, Imax):
D = int(sqrt(N / Imax))
mobius = Mobius(D)
# compute S1
s1 = 0
for i in range(1, D + 1):
s1 += mobius[i] * (N // (i * i))
# compute M(d), d = 1, ..., D
M_list = [0]
M = 0
for m in mobius[1:]:
M += m
M_list.append(M)
# compute M(sqrt(n / i)), i = Imax - 1, ..., 1
Mxi_list = []
Mxi_sum = 0
for i in range(Imax - 1, 0, -1):
Mxi = 1
xi = int(sqrt(N // i))
sqd = int(sqrt(xi))
# sqd < D <= xi
for j in range(1, xi // (sqd + 1) + 1):
Mxi -= (xi // j - xi // (j + 1)) * M_list[j]
for j in range(2, sqd + 1):
if xi // j <= D:
Mxi -= M_list[xi // j]
else:
Mxi -= Mxi_list[Imax - j * j * i - 1]
Mxi_list.append(Mxi)
Mxi_sum += Mxi
# compute S2
s2 = Mxi_sum - (Imax - 1) * M_list[-1]
return s1 + s2
def sub(N: int) -> int:
I = int(pow(N, 1/5))
ans = efficient_square_free(N, I)
return ans
def main() -> None:
L, R = map(int, input().split())
ans = sub(R)
if L - 1 >= 1:
ans -= sub(L - 1)
print(ans)
if __name__ == '__main__':
main()
iiljj