結果
| 問題 | No.3505 Sum of Prod of Root |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2026-04-19 07:15:47 |
| 言語 | PyPy3 (7.3.17) |
| 結果 |
AC
|
| 実行時間 | 1,319 ms / 2,000 ms |
| コード長 | 1,550 bytes |
| 記録 | |
| コンパイル時間 | 1,024 ms |
| コンパイル使用メモリ | 85,456 KB |
| 実行使用メモリ | 309,260 KB |
| 最終ジャッジ日時 | 2026-04-19 07:16:01 |
| 合計ジャッジ時間 | 6,208 ms |
|
ジャッジサーバーID (参考情報) |
judge1_1 / judge3_0 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | AC * 13 |
ソースコード
import sys
import math
from collections import defaultdict
input_data = sys.stdin.read().split()
N = int(input_data[0])
MOD = 998244353
INV2 = pow(2, MOD - 2, MOD)
INV4 = pow(4, MOD - 2, MOD)
INV6 = pow(6, MOD - 2, MOD)
INV30 = pow(30, MOD - 2, MOD)
def F(R):
if R <= 0:
return 0
m = math.isqrt(R)
n = (m - 1) % MOD
S2 = n * (n + 1) % MOD * (2 * n + 1) % MOD * INV6 % MOD
S3 = n * n % MOD * (n + 1) % MOD * (n + 1) % MOD * INV4 % MOD
poly = (3 * n * n + 3 * n - 1) % MOD
S4 = n * (n + 1) % MOD * (2 * n + 1) % MOD * poly % MOD * INV30 % MOD
sum1 = (2 * S4 + 3 * S3 + S2) % MOD
count = (R - m * m + 1) % MOD
sum2_val = (m * m + R) % MOD * count % MOD * INV2 % MOD
sum2 = (m % MOD) * sum2_val % MOD
return (sum1 + sum2) % MOD
events = defaultdict(list)
for k in range(3, 60):
x = 2
while True:
p = x ** k
if p > N:
break
events[p].append((k, x))
x += 1
boundaries = sorted(list(events.keys()))
if not boundaries or boundaries[0] != 1:
boundaries.insert(0, 1)
boundaries.append(N + 1)
ans = 0
roots = [1] * 60
current_h = 1
for i in range(len(boundaries) - 1):
L = boundaries[i]
R = boundaries[i + 1] - 1
if L in events:
for k, x in events[L]:
roots[k] = x
current_h = 1
for k in range(3, 60):
if roots[k] > 1:
current_h = (current_h * roots[k]) % MOD
sum_val = (F(R) - F(L - 1)) % MOD
ans = (ans + current_h * sum_val) % MOD
print(ans)