#ifdef ONLINE_JUDGE #pragma GCC optimize("Ofast") #pragma GCC optimize("unroll-loops") #endif #include #include using namespace std; using namespace atcoder; typedef long long ll; typedef unsigned long long ull; typedef long double ld; #define rep(i, n) for (ll i = 0; i < (ll)(n); i++) #define rrep(i,start,end) for (ll i = start;i >= (ll)(end);i--) #define repn(i,end) for(ll i = 0; i <= (ll)(end); i++) #define reps(i,start,end) for(ll i = start; i < (ll)(end); i++) #define repsn(i,start,end) for(ll i = start; i <= (ll)(end); i++) #define each(p,a) for(auto &p:a) typedef vector vll; typedef vector> vpll; typedef vector>> vvpll; typedef vector> vvll; typedef vector>> vvvll; typedef set sll; typedef map mpll; typedef pair pll; typedef tuple tpl3; typedef tuple tpl4; typedef tuple tpl5; typedef tuple tpl6; #define LL(...) ll __VA_ARGS__; input(__VA_ARGS__) #define LD(...) ld __VA_ARGS__; input(__VA_ARGS__) #define Str(...) string __VA_ARGS__; input(__VA_ARGS__) #define Ch(...) char __VA_ARGS__; input(__VA_ARGS__) #define all(a) (a).begin(),(a).end() #define UNIQUE(v) v.erase( unique(v.begin(), v.end()), v.end() ); #define sz(x) (ll)x.size() // << std::fixed << std::setprecision(10) const ll INF = 1LL << 60; const ld EPS = 1e-9; ll lceil(ll a,ll b){if(a%b==0){return a/b;}if(a>=0){return (a/b)+1;}else{return -((-a)/b);}} ll lfloor(ll a,ll b){if(a%b==0){return a/b;}if(a>=0){return (a/b);}else{return -((-a)/b)-1;}} inline ll positive_mod(ll a,ll m){return (a % m + m)%m;} inline ll popcnt(ull a){ return __builtin_popcountll(a);} //0indexed inline ll topbit(ll a){assert(a != 0);return 63 - __builtin_clzll(a);} inline ll smlbit(ll a){assert(a != 0);return __builtin_ctzll(a);} template bool chmin(T& a, T b){if(a > b){a = b;return true;}return false;} template bool chmax(T& a, T b){if(a < b){a = b;return true;}return false;} template std::istream &operator>>(std::istream&is,std::vector&v){for(T &in:v){is>>in;}return is;} template std::ostream &operator<<(std::ostream&os,const std::vector&v){for(auto it=std::begin(v);it!=std::end(v);){os<<*it<<((++it)!=std::end(v)?" ":"");}return os;} templatestd::ostream &operator<< (std::ostream &os, std::pair p){os << "{" << p.first << "," << p.second << "}";return os;} templatevoid input(T&... a){(cin >> ... >> a);} void print(){cout << endl;} templatevoid print(const T& a, const Ts&... b){cout << a;((cout << ' ' << b), ...);cout << endl;} template void pspace(const T& a){ cout << a << ' ';} void perr(){cerr << endl;} templatevoid perr(const T& a, const Ts&... b){cerr << a;((cerr << ' ' << b), ...);cerr << endl;} void yes(bool i = true){ return print(i?"yes":"no"); } void Yes(bool i = true){ return print(i?"Yes":"No"); } void YES(bool i = true){ return print(i?"YES":"NO"); } template vector &operator++(vector &v) {for(auto &e : v) e++;return v;} template vector operator++(vector &v, signed) {auto res = v;for(auto &e : v) e++;return res;} template vector &operator--(vector &v) {for(auto &e : v) e--;return v;} template vector operator--(vector &v, signed) {auto res = v;for(auto &e : v) e--;return res;} //grid探索用 vector _ta = {0,0,1,-1,1,1,-1,-1}; vector _yo = {1,-1,0,0,1,-1,1,-1}; bool isin(ll now_i,ll now_j,ll h,ll w){return (0<=now_i && now_i < h && 0 <= now_j && now_j < w);} ll lpow(ll x,ll n){ll ans = 1;while(n >0){if(n & 1)ans *= x;x *= x;n >>= 1;}return ans;} ll Modlpow(ll x,ll n,ll m){ll ans = 1;ll a = x%m;while(n >0){if(n & 1){ans *= a;ans%= m;}a *= a;a %= m;n >>= 1;}return ans;} const ll MOD9 = 998244353LL; const ll MOD10 = 1000000007LL; using mint = modint998244353; //参照渡しで値を作成して渡す void Maketest(ll &a,ll &b,ll &k){ //配列を渡すときは最初に.clear()をしておく random_device seed_gen; mt19937_64 rnd(seed_gen()); uniform_int_distribution da(-5, 5); uniform_int_distribution dc(1, 10); a = da(rnd); b = da(rnd); k = dc(rnd); uniform_int_distribution dd(0, 1); } mint correct(ll a,ll b,ll k){ ll ans = 0; rep(i,1 << k){ ll v = 0; rep(j,k){ if(i >> j &1){ v += a; }else{ v *= b; } } chmax(ans,v); } // cerr << ans << endl; return mint(ans); //答えの型注意 } mint solve(ll a,ll b,ll k){ if(a == 0){ return 0; } if(b == 0){ if(a > 0){ return mint(a * k); }else{ return 0; } } // auto mul = [&](ll u,ll v){ // if(INF/u <= v)return INF; // return u * v; // }; if(a > 0 && b > 0){ if(b == 1){ mint ans = mint(a) * k; return ans; }else{ mint ans = mint(a) * mint(b).pow(k-1); return ans; } } if(a < 0 && b > 0){ return 0; } if(a > 0 && b < 0){ if(b == -1){ mint ans = mint(a)*k; return ans; }else{ ll bk = (k-1)/2; ll rem =k- 2 * bk; mint ans = (mint(a)*rem)*mint(b*b).pow(bk); return ans; } } assert(a < 0 && b < 0); if(b == -1){ mint ans = mint(-a) * (k-1); return ans; } //bは奇数回 if(k % 2 == 0){ ll bk = k-1; mint ans = mint(-a)*mint(-b).pow(bk); return ans; }else{ if(k == 1){ return 0; } ll bk = k-2; assert(bk >= 0); mint ans = mint(-a*2)*mint(-b).pow(bk); return ans; } } void test(){ rep(z,100000){ ll a,b,k; Maketest(a,b,k); mint a1 = solve(a,b,k); mint a2 = correct(a,b,k); if(a1 != a2){ print(a,b,k); print(a1.val() ,a2.val()); cout << endl; } } } void nomal(){ LL(a,b,k); cout << solve(a,b,k).val() << endl; } int main(){ ios::sync_with_stdio(false);cin.tie(nullptr); bool istest = 0; if(istest){ test(); }else{ LL(t); while(t--)nomal(); } }