Find the number, modulo 998244353, of sequences of length N consisting of 0, 1 and 2 such that none of their contiguous subsequences totals to X.

Constraints

* 1 \leq N \leq 3000
* 1 \leq X \leq 2N
* N and X are integers.

Input

Input is given from Standard Input in the following format:


N X


Output

Print the number, modulo 998244353, of sequences that satisfy the condition.

Examples

Input

3 3


Output

14


Input

8 6


Output

1179


Input

10 1


Output

1024


Input

9 13


Output

18402


Input

314 159


Output

459765451
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cassert>
#include <vector>
#include <string>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <algorithm>
using namespace std;


typedef long long i64;
const int inf = (int)1.05e9;

const i64 mod = 998244353;

i64 mof(i64 x)
{
	if(x < mod * 2) {
		return (x >= mod) ? x - mod : x;
	}
	return x % mod;
}

int main()
{
	int n, x;

	scanf("%d%d", &n, &x);

	vector<vector<i64>> waf(n + 1);
	for(auto& w : waf) {
		w.resize(2 * n + 1, 0);
	}

	waf[0][0] = 1;

	for(int i = 1; i <= n; i++) {

		waf[i][1] = waf[i - 1][0];

		for(int j = 2; j <= 2 * n; j++) {
			waf[i][j] = mof(waf[i - 1][j - 1] + waf[i - 1][j - 2]);
		}
	}

	vector<vector<i64>> choose(n + 1);
	for(auto& c : choose) {
		c.resize(n + 1, 0);
	}

	for(int i = 0; i <= n; i++) {
		choose[i][0] = 1;
	}

	for(int i = 1; i <= n; i++) {
		for(int j = 1; j <= n; j++) {
			if(i < j) {
				choose[i][j] = 0;
			} else {
				choose[i][j] = mof(choose[i - 1][j] + choose[i - 1][j - 1]);
			}
			// printf("%d C %d = %lld\n", i, j, choose[i][j]);
		}
	}

	i64 ans = 1;

	for(int i = 0; i < x; i++) {
		i64 s = 0;
		for(int m = 1; m <= n; m++) {
			s = mof(s + waf[m][i] * choose[n][m]);
		}
		ans = mof(ans + s);
		// printf("waf %d -> %lld\n", i, s);
	}

	for(int len = x + 1; len <= 2 * n; len++) {

		if((len - x) % 2 == 0) {
			continue;
		}

		int k = len - x;

		if(x - 1 <= k + 1) {

			if(len % 2 == 1) {
				continue;
			}
			ans = mof(ans + choose[n][len / 2]);
			continue;
		}

		int rem = (x - 1) - (k + 1);
		int right = (k + 1) / 2;

		i64 s = 0;
		for(int m = 1; m + 2 * right <= n; m++) {
			s = mof(s + waf[m][rem] * choose[n][n - m - (right * 2)]);
		}
		ans = mof(ans + s);

		//printf("%d -> %lld\n", len, s);
	}

	printf("%lld\n", ans);

	return 0;
}

/* waffle */
