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 JAVA):

Solution:
import java.io.*;
import java.util.*;

public class Codeforces1153F {

	public static void main(String[] args) throws IOException {
		int P = 998244353;
		
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		int n = Integer.parseInt(st.nextToken());
		int real_k = Integer.parseInt(st.nextToken());
		int l = Integer.parseInt(st.nextToken());
				
		//generate factorials
		int[] factorials = new int[2*n+2];
		factorials[0] = 1;
		for (int i = 1; i <= 2*n+1; i++) {
			factorials[i] = multiply(factorials[i-1], i, P);
		}
		
		//number of ways to choose k pairs from 2k elements
		//where order doesn't matter
		//equals (2k)!/(2^n)/k! = (2k-1)!!
		int[] doublefact = new int[n+1];
		doublefact[0] = 1;
		for (int i = 1; i <= n; i++) {
			doublefact[i] = multiply(doublefact[i-1], (2*i-1), P);
		}

		//list[r][k] stores for rth segment, exactly k of the n segments covering it 
		int[][] list = new int[2*n+2][n+1];
		
		for (int r = 1; r <= 2*n+1; r++) {
			for (int k = 1; k <= n; k++) {
				if (((r%2) != (k%2)) && (r-1 >= k) && (2*n+1-r >= k)) {
					int num = multiply(factorials[r-1], factorials[2*n+1-r], P);
					num = multiply(num, doublefact[(r-k-1)/2], P);
					num = multiply(num, doublefact[(2*n+1-r-k)/2], P);
					
					int denom = multiply(factorials[r-k-1], factorials[2*n+1-r-k], P);
					denom = multiply(denom, factorials[k], P);
										
					list[r][k] = multiply(num, inverse(multiply(denom, doublefact[n], P), P), P);
				}
				
			}
		}
		
		int ans = 0;
		for (int r = 1; r <= 2*n+1; r++) {
			for (int k = real_k; k <= n; k++) {
				ans += list[r][k];
				ans %= P;
			}
		}
		
		ans = multiply(ans, l, P);
		ans = multiply(ans, inverse(2*n+1, P), P);
		
		System.out.println(ans);

	}
	
	public static int multiply (int a, int b, int n) {
		long ab = (long) a * (long) b;
		return ((int) (ab%n));
	}
	
	public static int inverse (int a, int n) {
		int m = n;
		int r1 = 1;
		int r2 = 0;
		int r3 = 0;
		int r4 = 1;
		while ((a > 0) && (n > 0)) {
			if (n >= a) {
				r3 -= r1*(n/a);
				r4 -= r2*(n/a);
				n = n%a;
			}
			else {
				int tmp = a;
				a = n;
				n = tmp;
				tmp = r1;
				r1 = r3;
				r3 = tmp;
				tmp = r2;
				r2 = r4;
				r4 = tmp;
			}
		}
		if (a == 0) {
			if (r3 >= 0)
				return (r3%m);
			else
				return (m+(r3%m));
		}
		else {
			if (r1 >= 0)
				return (r1%m);
			else
				return (m+(r1%m));
		}

	}

}