#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,avx2") #pragma GCC optimize("Ofast") #pragma GCC optimize("unroll-loops") #include using namespace std; #include using Modint = atcoder::modint998244353; int main(){ int N, M, K; cin >> N >> M >> K; const Modint s = M * 2 - 1 + (K == 0); vector a = {1}, b = {0, 1}, a2; Modint ans = 0; for(int i = 0; i < N; i++){ a2.assign(a.size() + M * 2, 0); for(int i = 0; i < b.size() - 1; i++) a2[i] += b[i + 1]; for(int i = b.size() - 1; i < a2.size(); i++) a2[i] += b.back(); for(int i = 1; i < b.size() - 1; i++) a2.end()[-i] -= b.rbegin()[i]; for(int i = 0; i < a.size(); i++) a2[i + M + K] -= a[i]; if(K) for(int i = 0; i < a.size(); i++) a2[i + M - K] -= a[i]; swap(a, a2); b.resize(a.size() + 1); for(int i = 0; i < a.size(); i++) b[i + 1] = b[i] + a[i]; ans *= s; ans += b[M * (i + 1)] * (N - i); } cout << ans.val() << endl; }