結果

問題 No.3462 Buttons
コンテスト
ユーザー くらげ
提出日時 2026-01-10 17:59:13
言語 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  
実行時間 718 ms / 2,000 ms
コード長 2,669 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 2,333 ms
コンパイル使用メモリ 214,784 KB
実行使用メモリ 7,848 KB
最終ジャッジ日時 2026-02-28 13:03:53
合計ジャッジ時間 14,497 ms
ジャッジサーバーID
(参考情報)
judge1 / judge5
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 1
other AC * 15
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
#define rep(i,n) for(int (i) = 0; i<(n); i++)

template<ll mod> struct modint{
    public:
    ll x;
    modint(ll x=0) : x((x%mod+mod)%mod) {}
    modint operator-() const { return modint(-x); }
    modint& operator+=(const modint& a){
        if(mod<=(x += a.x)) x-=mod;
        return *this;
    }
    modint& operator-=(const modint& a){
        if(mod<=(x+=mod-a.x)) x-=mod;
        return *this;
    }
    modint& operator*=(const modint& a){
        (x*=a.x)%=mod;
        return *this;
    }
    modint& operator++(){
        ++x;
        return *this;
    }
    modint operator++(int){
        modint temp = *this;
        x++;
        return temp;
    }
    modint& operator--(){
        --x;
        return *this;
    }
    modint operator--(int){
        modint temp = *this;
        x--;
        return temp;
    }
    modint pow(ll t) const{
        modint a=1,b=x;
        while(t){
            if(t&1) a*=b;
            b*=b;
            t/=2;
        }
        return a;
    }
    modint inv() const { return pow(mod-2); }
    modint& operator/=(const modint& a){ return (*this)*=a.inv(); }
    friend modint operator+(const modint& a, const modint& b) { return modint(a)+=b; }
    friend modint operator-(const modint& a, const modint& b) { return modint(a)-=b; }
    friend modint operator*(const modint& a, const modint& b) { return modint(a)*=b; }
    friend modint operator/(const modint& a, const modint& b) { return modint(a)/=b; }
    friend bool operator==(const modint& a, const modint& b) { return (modint(a).x==b.x); }
    friend bool operator!=(const modint& a, const modint& b) { return (modint(a).x!=b.x); }
    friend ostream& operator<<(ostream& os, const modint& m){ os << m.x; return os; }
    friend istream& operator>>(istream& is, modint& m){ is >> m.x; return is; }
};

using fp998=modint<998244353>;
using fp107=modint<1000000007>;

fp998 solve(){
    ll a, b, k;
    cin >> a >> b >> k;
    fp998 p = a, q = b;

    if(0<a){
        if(abs(b)<=1) return p*k; // A を k 回
        else if(0<b) return q.pow(k-1)*p; // A を 1 回、B を k-1 回
        else{ // A を 1-2 回、B**2 を (k-1)/2 回
            q *= q;
            fp998 ans = q.pow((k-1)/2);
            k -= (k-1)/2*2;
            return ans*p*k;
        }
    }

    if(a==0) return 0;
    
    // a<0

    if(0<=b) return 0;
    if(b==-1) return (-p)*(k-1);

    // A*B を 1 回、B**2 を (k-2)/2 回
    if(k<2) return 0;

    fp998 x = a*b;
    if(k%2) x *= 2;
    q *= q;
    return q.pow((k-2)/2)*x;
}

int main(){
    int t;
    cin >> t;
    while(t--) cout << solve() << "\n";
}
0