Problem: Getting closer and closer to a mathematician, Serval becomes a university student on math major in Japari University. On the Calculus class, his teacher taught him how to calculate the expected length of a random subsegment of a given segment. Then he left a bonus problem as homework, with the award of a garage kit from IOI. The bonus is to extend this problem to the general case as follows.

You are given a segment with length l. We randomly choose n segments by choosing two points (maybe with non-integer coordinates) from the given segment equiprobably and the interval between the two points forms a segment. You are given the number of random segments n, and another integer k. The 2n endpoints of the chosen segments split the segment into (2n+1) intervals. Your task is to calculate the expected total length of those intervals that are covered by at least k segments of the n random segments.

You should find the answer modulo 998244353.

Input

First line contains three space-separated positive integers n, k and l (1≤ k ≤ n ≤ 2000, 1≤ l≤ 10^9).

Output

Output one integer — the expected total length of all the intervals covered by at least k segments of the n random segments modulo 998244353.

Formally, let M = 998244353. It can be shown that the answer can be expressed as an irreducible fraction p/q, where p and q are integers and q not ≡ 0 \pmod{M}. Output the integer equal to p ⋅ q^{-1} mod M. In other words, output such an integer x that 0 ≤ x < M and x ⋅ q ≡ p \pmod{M}.

Examples

Input


1 1 1


Output


332748118


Input


6 2 1


Output


760234711


Input


7 5 3


Output


223383352


Input


97 31 9984524


Output


267137618

Note

In the first example, the expected total length is \int_0^1 \int_0^1 |x-y|  dx dy = {1\over 3}, and 3^{-1} modulo 998244353 is 332748118.

Solution (in CPP):

Solution:
#include <bits/stdc++.h>
const int N = 4097, P = 998244353;
int lim, rev[N], w[N], fac[N], ifac[N], f[N], g[N], h[N];
int read() {
  int x;
  scanf("%d", &x);
  return x;
}
int inc(int a, int b) { return a += b - P, a + (a >> 31 & P); }
int dec(int a, int b) { return a -= b, a + (a >> 31 & P); }
int mul(int a, int b) { return 1ll * a * b % P; }
int pow(int a, int k) {
  int r = 1;
  for (; k; k >>= 1, a = mul(a, a))
    if (k & 1) r = mul(a, r);
  return r;
}
void init(int n) {
  int p = (lim = 1 << (32 - __builtin_clz(n))) >> 1, g = pow(3, (P - 1) / lim);
  w[p] = 1, fac[0] = 1;
  for (int i = 1; i < lim; ++i) rev[i] = (rev[i >> 1] >> 1) | (i & 1 ? p : 0);
  for (int i = p + 1; i < lim; ++i) w[i] = mul(w[i - 1], g);
  for (int i = p - 1; i; --i) w[i] = w[i << 1];
  for (int i = 1; i <= n; ++i) fac[i] = mul(fac[i - 1], i);
  ifac[n] = pow(fac[n], P - 2);
  for (int i = n; i; --i) ifac[i - 1] = mul(ifac[i], i);
}
void NTT(int* a, int f) {
  if (!~f) std::reverse(a + 1, a + lim);
  for (int i = 1; i < lim; ++i)
    if (i < rev[i]) std::swap(a[i], a[rev[i]]);
  for (int i = 1; i < lim; i <<= 1)
    for (int j = 0, d = i << 1; j < lim; j += d)
      for (int k = 0, x; k < i; ++k)
        x = mul(a[i + j + k], w[i + k]), a[i + j + k] = dec(a[j + k], x),
        a[j + k] = inc(a[j + k], x);
  if (!~f)
    for (int i = 0, x = P - (P - 1) / lim; i < lim; ++i) a[i] = mul(a[i], x);
}
int main() {
  int n = read(), k = read(), l = read(), ans = 0;
  init(2 * n + 1);
  for (int i = k; i <= n; ++i) f[i] = ifac[i];
  for (int i = 0; i <= n; ++i) g[i] = i & 1 ? P - ifac[i] : ifac[i];
  NTT(f, 1), NTT(g, 1);
  for (int i = 0; i < lim; ++i) f[i] = mul(f[i], g[i]);
  NTT(f, -1);
  for (int i = 1, pw = 2; i <= n; pw = inc(pw, pw), ++i)
    h[i] = mul(mul(mul(mul(fac[i], fac[i]), pw), ifac[i * 2 + 1]), ifac[n - i]);
  for (int i = k; i <= n; ++i) ans = inc(ans, mul(f[i], h[i]));
  printf("%d", mul(mul(ans, fac[n]), l));
}