結果

問題 No.3505 Sum of Prod of Root
コンテスト
ユーザー kuma-1971
提出日時 2026-04-18 04:48:29
言語 C++23
(gcc 15.2.0 + boost 1.89.0)
コンパイル:
g++-15 -O2 -lm -std=c++23 -Wuninitialized -DONLINE_JUDGE -o a.out _filename_
実行:
./a.out
結果
TLE  
実行時間 -
コード長 1,688 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 1,831 ms
コンパイル使用メモリ 190,080 KB
実行使用メモリ 6,400 KB
最終ジャッジ日時 2026-04-18 04:48:57
合計ジャッジ時間 6,409 ms
ジャッジサーバーID
(参考情報)
judge2_1 / judge1_0
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample -- * 1
other AC * 1 TLE * 1 -- * 11
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

#include <iostream>
#include <vector>
#include <cmath>
#include <algorithm>

using namespace std;

typedef __int128_t int128;
const long long MOD = 998244353;

long long safe_pow(long long x, int k, long long N) {
    if (x <= 1) return (k == 0 ? 1 : x);
    int128 res = 1;
    for (int i = 0; i < k; ++i) {
        res *= x;
        if (res > N) return N + 1;
    }
    return (long long)res;
}

long long get_root(long long n, int k) {
    if (k == 1) return n;
    long long r = pow(n, 1.0 / k);
    r = max(1LL, r - 1);
    while (safe_pow(r + 1, k, n) <= n) r++;
    return r;
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    long long N;
    if (!(cin >> N)) return 0;

    vector<long long> points;
    points.push_back(1);
    points.push_back(N + 1);

    for (int k = 2; k <= 60; ++k) {
        for (long long m = 1; ; ++m) {
            long long val = safe_pow(m, k, N);
            if (val > N) break;
            points.push_back(val);
        }
    }
    sort(points.begin(), points.end());
    points.erase(unique(points.begin(), points.end()), points.end());

    long long ans = 0;
    for (size_t i = 0; i + 1 < points.size(); ++i) {
        long long L = points[i];
        long long R = points[i + 1] - 1;

        long long prod = 1;
        for (int k = 2; k <= 60; ++k) {
            long long r = get_root(L, k);
            if (r < 2) break;
            prod = (prod * (r % MOD)) % MOD;
        }

        int128 count = (R - L + 1);
        int128 sum_i = (int128)(L + R) * count / 2;
        long long term = (long long)((sum_i % MOD) * prod % MOD);
        ans = (ans + term) % MOD;
    }

    cout << ans << endl;

    return 0;
}
0