結果

問題 No.3118 Increment or Multiply
ユーザー テナガザル
提出日時 2025-04-19 16:58:04
言語 C++23
(gcc 13.3.0 + boost 1.87.0)
結果
AC  
実行時間 33 ms / 2,000 ms
コード長 858 bytes
コンパイル時間 1,330 ms
コンパイル使用メモリ 102,424 KB
実行使用メモリ 7,844 KB
最終ジャッジ日時 2025-04-19 16:58:08
合計ジャッジ時間 3,681 ms
ジャッジサーバーID
(参考情報)
judge5 / judge4
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 1
other AC * 35
権限があれば一括ダウンロードができます

ソースコード

diff #

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

using namespace std;

long long s(long long a)
{
  const int mod = 998244353;
  a %= mod;
  int inv = 499122177;
  return a * (a + 1) % mod * inv % mod;
}

void solve()
{
  const int mod = 998244353;
  long long n, a;
  cin >> n >> a;
  if (a == 1)
  {
    cout << s(n - 1) << endl;
    return;
  }
  vector<long long> v, d;
  long long tmp = n, sum = 0;
  while (tmp > 0)
  {
    v.push_back(tmp);
    d.push_back(sum);
    sum += tmp % a;
    ++sum;
    tmp /= a;
  }
  v.push_back(0);
  long long ans = 0;
  for (int i = 0; i + 1 < v.size(); ++i)
  {
    long long cnt = (v[i] - v[i + 1]) % mod;
    ans += cnt * d[i] % mod;
    ans +=  v[i] % mod * cnt % mod - s(v[i]) + s(v[i + 1]) + mod;
    ans %= mod;
  }
  cout << ans << endl;
}

int main()
{
  int t;
  cin >> t;
  while (t--) solve();
}
0