結果
| 問題 | No.3505 Sum of Prod of Root |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2026-04-18 20:55:03 |
| 言語 | C++23 (gcc 15.2.0 + boost 1.89.0) |
| 結果 |
AC
|
| 実行時間 | 169 ms / 2,000 ms |
| コード長 | 2,318 bytes |
| 記録 | |
| コンパイル時間 | 2,826 ms |
| コンパイル使用メモリ | 343,232 KB |
| 実行使用メモリ | 27,772 KB |
| 最終ジャッジ日時 | 2026-04-18 20:55:11 |
| 合計ジャッジ時間 | 4,234 ms |
|
ジャッジサーバーID (参考情報) |
judge3_1 / judge2_1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | AC * 13 |
ソースコード
#include<bits/stdc++.h>
using namespace std;
const long long M = 998244353;
long long pw(long long b, long long e) {
long long r = 1;
b %= M;
while (e > 0) {
if (e % 2 == 1) r = r * b % M;
b = b * b % M;
e /= 2;
}
return r;
}
long long sqt(long long x) {
if (x == 0) return 0;
long long r = sqrt(x);
while ((__int128_t)(r + 1) * (r + 1) <= x) r++;
while ((__int128_t)r * r > x) r--;
return r;
}
long long F(long long n) {
if (n == 0) return 0;
long long m = sqt(n);
long long k = (m - 1) % M;
static long long i2 = pw(2, M - 2), i6 = pw(6, M - 2), i30 = pw(30, M - 2);
long long s2 = k * (k + 1) % M * (2 * k + 1) % M * i6 % M;
long long s3 = k * (k + 1) % M * i2 % M;
s3 = s3 * s3 % M;
long long py = (3 * k % M * k % M + 3 * k % M - 1 + M) % M;
long long s4 = k * (k + 1) % M * (2 * k + 1) % M * py % M * i30 % M;
long long a = (2 * s4 % M + 3 * s3 % M + s2) % M;
long long mm = m % M, nn = n % M, md = mm * mm % M;
long long s = (nn - md + 1 + M) % M, av = (md + nn) % M;
long long b = s * av % M * i2 % M * mm % M;
return (a + b) % M;
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
long long N;
if (!(cin >> N)) return 0;
vector<pair<long long, long long>> AA;
const int MX = 1000005;
vector<long long> iv(MX);
iv[1] = 1;
for (int i = 2; i < MX; i++) iv[i] = M - M / i * iv[M % i] % M;
auto giv = [&](long long v) { return v < MX ? iv[v] : pw(v, M - 2); };
for (int k = 3; k <= 62; ++k) {
for (long long y = 2; ; ++y) {
__int128_t p = 1;
for (int i = 0; i < k; ++i) { p *= y; if (p > N) break; }
if (p > N) break;
AA.push_back({(long long)p, (y % M) * giv(y - 1) % M});
}
}
sort(AA.begin(), AA.end());
long long ans = 0, L = 1, v3 = 1;
int i = 0, E = AA.size();
while (i < E) {
long long x = AA[i].first;
if (L < x) {
ans = (ans + v3 * ((F(x - 1) - F(L - 1) + M) % M)) % M;
L = x;
}
while (i < E && AA[i].first == x) {
v3 = v3 * AA[i].second % M;
i++;
}
}
if (L <= N) ans = (ans + v3 * ((F(N) - F(L - 1) + M) % M)) % M;
cout << ans << endl;
return 0;
}