#include <bits/stdc++.h>
using namespace std;
template <typename T>
inline bool chkmin(T &x, T y) {
  return (y < x) ? (x = y, 1) : 0;
}
template <typename T>
inline bool chkmax(T &x, T y) {
  return (y > x) ? (x = y, 1) : 0;
}
inline int read() {
  int x;
  char c;
  int f = 1;
  while ((c = getchar()) != '-' && (c > '9' || c < '0'))
    ;
  if (c == '-') f = -1, c = getchar();
  x = c ^ '0';
  while ((c = getchar()) >= '0' && c <= '9')
    x = (x << 1) + (x << 3) + (c ^ '0');
  return x * f;
}
inline long long readll() {
  long long x;
  char c;
  int f = 1;
  while ((c = getchar()) != '-' && (c > '9' || c < '0'))
    ;
  if (c == '-') f = -1, c = getchar();
  x = c ^ '0';
  while ((c = getchar()) >= '0' && c <= '9')
    x = (x << 1ll) + (x << 3ll) + (c ^ '0');
  return x * f;
}
const int maxn = 2000 + 10, mod = 998244353;
int dp[maxn * 2][maxn], f[maxn * 2][maxn];
inline int ksm(int x, int y) {
  int res = 1;
  while (y) {
    if (y & 1) res = (long long)res * x % mod;
    x = (long long)x * x % mod;
    y >>= 1;
  }
  return res;
}
int main() {
  int n = read(), m = read(), len = read();
  f[0][0] = 1;
  for (register int i = 1, iend = 2 * n; i <= iend; ++i) {
    for (register int j = 0, jend = min(i, n); j <= jend; ++j) {
      if (j == 0)
        dp[i][j] = dp[i - 1][j + 1], f[i][j] = f[i - 1][j + 1];
      else
        f[i][j] =
            ((long long)f[i - 1][j + 1] * (j + 1) + f[i - 1][j - 1]) % mod,
        dp[i][j] =
            (dp[i - 1][j - 1] + (long long)dp[i - 1][j + 1] * (j + 1)) % mod;
      if (j >= m) dp[i][j] = (f[i][j] + dp[i][j]) % mod;
    }
  }
  printf("%lld\n",
         (long long)dp[2 * n][0] * len % mod *
             ksm((long long)f[2 * n][0] * (2 * n + 1) % mod, mod - 2) % mod);
  return 0;
}
