#include <bits/stdc++.h>
using namespace std;
template<typename T = int> vector<T> create(size_t n){ return vector<T>(n); }
template<typename T, typename... Args> auto create(size_t n, Args... args){ return vector<decltype(create<T>(args...))>(n, create<T>(args...)); }
template<typename T = int, T mod = 1'000'000'007, typename U = long long>
struct umod{
    T val;
    umod(): val(0){}
    umod(U x){ x %= mod; if(x < 0) x += mod; val = x;}
    umod& operator += (umod oth){ val += oth.val; if(val >= mod) val -= mod; return *this; }
    umod& operator -= (umod oth){ val -= oth.val; if(val < 0) val += mod; return *this; }
    umod& operator *= (umod oth){ val = ((U)val) * oth.val % mod; return *this; }
    umod& operator /= (umod oth){ return *this *= oth.inverse(); }
    umod& operator ^= (U oth){ return *this = pwr(*this, oth); }
    umod operator + (umod oth) const { return umod(*this) += oth; }
    umod operator - (umod oth) const { return umod(*this) -= oth; }
    umod operator * (umod oth) const { return umod(*this) *= oth; }
    umod operator / (umod oth) const { return umod(*this) /= oth; }
    umod operator ^ (long long oth) const { return umod(*this) ^= oth; }
    bool operator < (umod oth) const { return val < oth.val; }
    bool operator > (umod oth) const { return val > oth.val; }
    bool operator <= (umod oth) const { return val <= oth.val; }
    bool operator >= (umod oth) const { return val >= oth.val; }
    bool operator == (umod oth) const { return val == oth.val; }
    bool operator != (umod oth) const { return val != oth.val; }
    umod pwr(umod a, U b) const { umod r = 1; for(; b; a *= a, b >>= 1) if(b&1) r *= a; return r; }
    umod inverse() const {
        U a = val, b = mod, u = 1, v = 0;
        while(b){
            U t = a/b;
            a -= t * b; swap(a, b);
            u -= t * v; swap(u, v);
        }
        if(u < 0)
            u += mod;
        return u;
    }
};
using U = umod<int, 998244353>;
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	int n, m, k;
	cin >> n >> m >> k;
	if(max(n, m) == 1){
		cout << k << '\n';
		return 0;
	}
	if(min(n, m) == 1){
		cout << (U(k) ^ (max(n, m))).val << '\n';
		return 0;
	}
	if(n > m) swap(n, m);
	vector<U> ways_n(k + 1);
	for(int i = 1; i <= k; i++){
		ways_n[i] = (U(i) ^ n) - (U(i - 1) ^ n);
	}
	vector<U> fat(m + 1), ifat(m + 1);
	fat[0] = 1;
	for(int i = 1; i <= m; i++){
		fat[i] = fat[i - 1] * i;
	}
	for(int i = 0; i <= m; i++){
		ifat[i] = U(1) / fat[i];
	}
	auto ncr = [&](int n, int r){
		if(n < r) return U(0);
		if(n == r || r == 0) return U(1);
		return fat[n] * ifat[r] * ifat[n - r];
	};
	U ans = 0;
	for(int i = 1; i <= k; i++){
		// cout << i << ' ' << ways_n[i].val << ' ' << (U((k - i + 1)) ^ m).val << '\n';
		ans +=  ways_n[i] * (U((k - i + 1)) ^ m);
	}
	cout << ans.val << '\n';
	return 0;
}

#include <bits/stdc++.h>
using namespace std;

int main() {
    int T=1, caseIdx=0;
    //cin >> T;  
    while (T--) {
        caseIdx++;
        long r, x, y, ans=0;
        cin >> r >> x >> y;
        double d = sqrt(x*x + y*y);
        ans = ceil(d/r);
        if (ans==1 && d != r)
		    ++ans;
        cout << ans << endl;
    }
}