結果

問題 No.3462 Buttons
コンテスト
ユーザー おのせ
提出日時 2026-02-10 13:17:14
言語 C++17
(gcc 15.2.0 + boost 1.89.0)
コンパイル:
g++-15 -O2 -lm -std=c++17 -Wuninitialized -DONLINE_JUDGE -o a.out _filename_
実行:
./a.out
結果
AC  
実行時間 765 ms / 2,000 ms
コード長 2,479 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 4,862 ms
コンパイル使用メモリ 279,776 KB
実行使用メモリ 7,844 KB
最終ジャッジ日時 2026-02-28 13:06:33
合計ジャッジ時間 18,370 ms
ジャッジサーバーID
(参考情報)
judge5 / judge1
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 1
other AC * 15
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

#include <bits/stdc++.h>
#include <atcoder/all>
#include <iostream>
#include <cmath>
using namespace std;
using namespace atcoder;
using ll = long long;
using lb = long double;
using P = pair<ll, ll>;
using T = tuple<ll, ll, ll>;
using vll = vector<ll>;
using vb = vector<bool>;
using vvll = vector<vector<ll>>;
using vP = vector<P>;
using Graph = vector<vector<ll>>;
using WGraph = vector<vector<pair<ll, ll>>>; // コスト、頂点番号の順
using mint = modint998244353;
//using mint = long double;
#define rep(i, n) for (ll i = 0; i < (ll)(n); i++)
mt19937_64 rng(58);
long double PI = 3.14159265358979;
const ll LLMAX = 9223372036854775807;
const ll INF = 1e18;
vector<ll> di = {-1, 0, 1, 0}; // 上左下右
vector<ll> dj = {0, -1, 0, 1};
template<typename T> inline bool chmax(T &a, T b) { return ((a < b) ? (a = b, true) : (false)); }
template<typename T> inline bool chmin(T &a, T b) { return ((a > b) ? (a = b, true) : (false)); }

void solve() {
    ll a, b, k;
    cin >> a >> b >> k;

    mint ans = 0;

    if (k == 0 || a == 0) {
        cout << 0 << endl;
        return;
    }
    if (a < 0 && b >= 0) {
        cout << 0 << endl;
        return;
    }
    if (b == 0) {
        if (a <= 0) cout << ans.val() << endl;
        else {
            ans = (mint)a * (mint)k;
            cout << ans.val() << endl;
        }
        return;
    }
    if (b == 1) {
        ans = (mint)a * (mint)k;
        cout << ans.val() << endl;
        return;
    }
    if (b == -1) {
        if (a > 0) {
            ans = (mint)a * (mint)(k);
            cout << ans.val() << endl;
        }
        else {
            if (k == 1) cout << 0 << endl;
            else {
                ans = (mint)abs(a) * (mint)(k - 1);
                cout << ans.val() << endl;
            }
        }
        return;
    }


    ll A = abs(a);
    ll B = abs(b);
    k--;
    ll cur = A;

    ll cnt = 0;
    if (a < 0) cnt++;
    if (b < 0) cnt += k;
    
    vector<mint> Rb(61);
    Rb[0] = B;
    rep (i, 60) Rb[i + 1] = Rb[i] * Rb[i];
    auto power = [&](ll x) {
        mint res = 1;
        rep (i, 61) {
            if ((x >> i) & 1) res *= Rb[i]; // ansにしてた
        }
        return res;
    };
    if (cnt % 2 == 0) {
        ans = (mint)cur * power(k);
    }
    else {
        if (k == 0) ans = 0;
        else ans = (mint)(cur + A) *power(k - 1);
    }

    cout << ans.val() << endl;
}

int main() {
    ll t;
    cin >> t;
    rep (ti, t) solve();
    return 0;
}
0