結果
問題 |
No.3118 Increment or Multiply
|
ユーザー |
|
提出日時 | 2025-04-18 21:39:51 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 102 ms / 2,000 ms |
コード長 | 1,864 bytes |
コンパイル時間 | 1,941 ms |
コンパイル使用メモリ | 195,452 KB |
実行使用メモリ | 7,844 KB |
最終ジャッジ日時 | 2025-04-18 21:39:56 |
合計ジャッジ時間 | 4,429 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 |
other | AC * 35 |
ソースコード
#include <bits/stdc++.h> using namespace std; //#include<atcoder/all> //using namespace atcoder; using ll = long long int; using ull = unsigned long long int; using ld = long double; constexpr ll MAX = 2000000000000000000; constexpr ld PI = 3.14159265358979; constexpr ll MOD = 998244353;//2024948111; ld dotorad(ld K){ return PI * K / 180.0; } ld radtodo(ld K){ return K * 180.0 / PI; } mt19937 mt; void randinit(){ srand((unsigned)time(NULL));mt = mt19937(rand()); } void solve(){ ll N,A; cin >> N >> A; if(A == 1){ ll a = (1 + N - 1) % MOD; ll b = (N - 1) % MOD; if(a % 2 == 0) a /= 2; else b /= 2; ll ans = a * b; ans %= MOD; cout << ans << endl; return; } ll s = 1,last = N,ans = 0; for(ll p = 0;p <= 100;p++){ if(last == 1) break; ll sa; if(MAX / A < s) sa = MAX; else sa = s * A; ll st = (N / (sa)) + 1; //cerr << st << " " << last << endl; if(last == st) break; ll m = 0,cp = N; for(ll i = 0;i < p;i++){ m += cp % A; cp /= A; } ll lst = (last - st); lst %= MOD; ans += (lst * (p % MOD)) % MOD; ans += (lst * (m % MOD)) % MOD; ans %= MOD; ll hiku = N / s; ans += (lst * (hiku % MOD)) % MOD; ans %= MOD; { ll a = (last - st); ll b = (last + st - 1); if(a % 2 == 0) a /= 2; else b /= 2; a %= MOD; b %= MOD; ans -= (a * b) % MOD; } ans %= MOD; if(ans < 0) ans += MOD; // cerr << "ans = " << ans << endl; last = st; if(MAX / A < s) break; s *= A; } cout << ans << endl; } int main(){ ll T; cin >> T; while(T--){ solve(); } }