結果
問題 |
No.3118 Increment or Multiply
|
ユーザー |
![]() |
提出日時 | 2025-04-20 17:52:50 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 12 ms / 2,000 ms |
コード長 | 1,219 bytes |
コンパイル時間 | 2,207 ms |
コンパイル使用メモリ | 192,508 KB |
実行使用メモリ | 7,848 KB |
最終ジャッジ日時 | 2025-04-20 17:52:55 |
合計ジャッジ時間 | 4,076 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 |
other | AC * 35 |
ソースコード
#include <bits/stdc++.h> using namespace std; using int64 = long long; const int64 MOD = 998244353; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int T; cin >> T; const int64 INV2 = (MOD + 1) / 2; // 2 の逆元 while (T--) { int64 N, A; cin >> N >> A; if (A == 1) { // 全部 +1 だけ int64 n = N % MOD; int64 nm1 = (N - 1) % MOD; int64 ans = n * nm1 % MOD * INV2 % MOD; cout << ans << "\n"; continue; } int64 ans = 0; int64 S = 0; // S_j を累積 (mod MOD) int64 x = N; while (x > 0) { int64 x_next = x / A; int64 L = x - x_next; // 区間長 L_j int64 Lm = L % MOD; // L_j * S_j int64 term1 = Lm * S % MOD; // L_j*(L_j-1)/2 int64 term2 = Lm * ((L - 1) % MOD + MOD) % MOD * INV2 % MOD; ans = (ans + term1 + term2) % MOD; // 次の S_{j+1} = S_j + (r_j+1) int64 r = x % A; S = (S + (r % MOD) + 1) % MOD; x = x_next; } cout << ans << "\n"; } return 0; }