結果

問題 No.3505 Sum of Prod of Root
コンテスト
ユーザー カプモカ
提出日時 2026-04-19 07:15:47
言語 PyPy3
(7.3.17)
コンパイル:
pypy3 -mpy_compile _filename_
実行:
pypy3 _filename_
結果
AC  
実行時間 1,319 ms / 2,000 ms
コード長 1,550 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 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
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

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)
0