You are given a grid, consisting of 2 rows and n columns. Each cell of this grid should be colored either black or white.

Two cells are considered neighbours if they have a common border and share the same color. Two cells A and B belong to the same component if they are neighbours, or if there is a neighbour of A that belongs to the same component with B.

Let's call some bicoloring beautiful if it has exactly k components.

Count the number of beautiful bicolorings. The number can be big enough, so print the answer modulo 998244353.

Input

The only line contains two integers n and k (1 ≤ n ≤ 1000, 1 ≤ k ≤ 2n) — the number of columns in a grid and the number of components required.

Output

Print a single integer — the number of beautiful bicolorings modulo 998244353.

Examples

Input

3 4


Output

12


Input

4 1


Output

2


Input

1 2


Output

2

Note

One of possible bicolorings in sample 1:

<image>
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.io.*;
import java.math.*;
public class Main7
{
	static class Pair
	{
		int x;
		int y;
		Pair(int x,int y)
		{
			this.x=x;
			this.y=y;
		}
	}
	static int mod=998244353;
	public static int[] sort(int[] a)
	{
		int n=a.length;
		ArrayList<Integer> ar=new ArrayList<>();
		for(int i=0;i<a.length;i++)
		{
			ar.add(a[i]);
		}
		Collections.sort(ar);
		for(int i=0;i<n;i++)
		{
			a[i]=ar.get(i);
		}
		return a;
	}
	public static long pow(long a, long b)
    {
        long result=1;
        while(b>0)
        {
            if (b % 2 != 0)
            {
                result=(result*a);
                b--;
            } 
            a=(a*a);
            b /= 2;
        }   
        return result;
    }
	
    public static long gcd(long a, long b)
    {
        if (a == 0)
            return b;
        return gcd(b%a, a);
    }   
	public static long lcm(long a, long b)
	{
		return a*(b/gcd(a,b));
	}
	static ArrayList<ArrayList<Integer>> graph;
	static public void main(String args[])throws IOException
	{
		int tt=1;
		StringBuilder sb1=new StringBuilder();
		for(int ttt=1;ttt<=tt;ttt++)
		{
			n=i();
			int k=i();
			int[][] a=new int[2][n];
			dp=new long[n][k+1][4];
			for(int i=0;i<n;i++)
				for(int j=0;j<=k;j++)
			Arrays.fill(dp[i][j],-1);
			long ans=0;
			long val=0,val1=0,val2=0,val3=0;
			val=recur(1,0,0,1,k);
			val1=recur(1,1,0,2,k);
			val2=recur(1,1,1,1,k);
			val3=recur(1,0,1,2,k);
			if(val!=-1)
				ans=(ans+val)%mod;
			if(val1!=-1)
				ans=(ans+val1)%mod;
			if(val2!=-1)
				ans=(ans+val2)%mod;
			if(val3!=-1)
				ans=(ans+val3)%mod;
			pln(ans+"");
		}
		System.out.print(sb1.toString());
	}
	static long[][][] dp;
	static int n;
	static long recur(int index,int firstRow,int secondrow,int count,int k)
	{
		if(count>k)
			return -1L;
		if(index>=n)
		{
			if(count==k)
				return 1;
			return -1L;
		}
		int num=0;
		if(firstRow==1)
			num+=1;
		if(secondrow==1)
			num+=2;
		if(dp[index][count][num]!=-1)
		{
			return dp[index][count][num];
		}
		long ans=0;
		// 0 0
		if(firstRow==0 || secondrow==0)
		{
			long val=recur(index+1,0,0,count,k);
			if(val!=-1)
				ans=(ans+val)%mod;
		}
		else
		{
			long val=recur(index+1,0,0,count+1,k);
			if(val!=-1)
				ans=(ans+val)%mod;
		
		}
		//1 1
		if(firstRow==1 || secondrow==1)
		{
			long val=recur(index+1,1,1,count,k);
			if(val!=-1)
				ans=(ans+val)%mod;
		}
		else
		{
			long val=recur(index+1,1,1,count+1,k);
			if(val!=-1)
				ans=(ans+val)%mod;
		}
		// 1 0
		if(firstRow==1 && secondrow==0)
		{
			long val=recur(index+1,1,0,count,k);
			if(val!=-1)
				ans=(ans+val)%mod;
		}
		else if(firstRow==0 && secondrow==0)
		{
			long val=recur(index+1,1,0,count+1,k);
			if(val!=-1)
				ans=(ans+val)%mod;
		}
		else if(firstRow==0 && secondrow==1)
		{
			long val=recur(index+1,1,0,count+2,k);
			if(val!=-1)
				ans=(ans+val)%mod;
		}
		else if(firstRow==1 && secondrow==1)
		{
			long val=recur(index+1,1,0,count+1,k);
			if(val!=-1)
				ans=(ans+val)%mod;
		}
		// 0 1
		if(firstRow==0 && secondrow==1)
		{
			long val=recur(index+1,0,1,count,k);
			if(val!=-1)
				ans=(ans+val)%mod;
		}
		else if(firstRow==0 && secondrow==0)
		{
			long val=recur(index+1,0,1,count+1,k);
			if(val!=-1)
				ans=(ans+val)%mod;
		}
		else if(firstRow==1 && secondrow==0)
		{
			long val=recur(index+1,0,1,count+2,k);
			if(val!=-1)
				ans=(ans+val)%mod;
		}
		else if(firstRow==1 && secondrow==1)
		{
			long val=recur(index+1,0,1,count+1,k);
			if(val!=-1)
				ans=(ans+val)%mod;
		}
		ans=ans%mod;
		dp[index][count][num]=ans;
		return ans;
	}
	/**/
	static InputReader in=new InputReader(System.in);
	static OutputWriter out=new OutputWriter(System.out);
	public static long l()
	{
		String s=in.String();
		return Long.parseLong(s);
	}
	public static void pln(String value)
	{
		System.out.println(value);
	}
	public static int i()
	{
		return in.Int();
	}
	public static String s()
	{
		return in.String();
	}
}
	class InputReader 
	{
		private InputStream stream;
		private byte[] buf = new byte[1024];
		private int curChar;
		private int numChars;
		private SpaceCharFilter filter;
	 
		public InputReader(InputStream stream) {
			this.stream = stream;
		}
	 
		public int read() {
			if (numChars== -1)
				throw new InputMismatchException();
			if (curChar >= numChars) {
				curChar = 0;
				try {
					numChars = stream.read(buf);
				} catch (IOException e) {
					throw new InputMismatchException();
				}
				if (numChars <= 0)
					return -1;
			}
			return buf[curChar++];
		}
	 
		public int Int() {
			int c = read();
			while (isSpaceChar(c))
				c = read();
			int sgn = 1;
			if (c == '-') {
				sgn = -1;
				c = read();
			}
			int res = 0;
			do {
				if (c < '0' || c > '9')
					throw new InputMismatchException();
				res *= 10;
				res += c - '0';
				c = read();
			} while (!isSpaceChar(c));
			return res * sgn;
		}
	 
		public String String() {
			int c = read();
			while (isSpaceChar(c))
				c = read();
			StringBuilder res = new StringBuilder();
			do {
				res.appendCodePoint(c);
				c = read();
			} while (!isSpaceChar(c));
			return res.toString();
		}
	 
		public boolean isSpaceChar(int c) {
			if (filter != null)
				return filter.isSpaceChar(c);
			return c == ' ' || c == '\n' || c == '\r' || c == '\t' || c == -1;
		}
	 
		public String next() {
			return String();
		}
	 
		public interface SpaceCharFilter {
			public boolean isSpaceChar(int ch);
		}
	}
	 
	class OutputWriter {
		private final PrintWriter writer;
	 
		public OutputWriter(OutputStream outputStream) {
			writer = new PrintWriter(new BufferedWriter(new OutputStreamWriter(outputStream)));
		}
	 
		public OutputWriter(Writer writer) {
			this.writer = new PrintWriter(writer);
		}
	 
		public void print(Object...objects) {
			for (int i = 0; i < objects.length; i++) {
				if (i != 0)
					writer.print(' ');
				writer.print(objects[i]);
			}
		}
	 
		public void printLine(Object...objects) {
			print(objects);
			writer.println();
		}
	 
		public void close() {
			writer.close();
		}
	 
		public void flush() {
			writer.flush();
		}
	 
		}
	 
		class IOUtils {
	 
		public static int[] readIntArray(InputReader in, int size) {
			int[] array = new int[size];
			for (int i = 0; i < size; i++)
				array[i] = in.Int();
			return array;
		}
	 
	} 

