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.awt.*;
import java.io.*;
import java.util.*;

public class Main implements Runnable {

    int maxn = (int)1e3+111;
    int inf = (int)1e18;
    long mod = (long)998244353;
    int n,m,k;
    int dx[][] = {{1,0},{0,1},{0,0},{1,1}};
    long memo[][][] = new long[maxn][4][2*maxn];
    boolean used[][][] = new boolean[maxn][4][2*maxn];

    void solve() throws Exception {
        n = in.nextInt();
        k = in.nextInt();
        long sum = 0;
        for (int i=0; i<dx.length; i++) {
            if (dx[i][0]==dx[i][1]) {
                sum+=calc(2,dx[i], 1);
            } else {
                sum+=calc(2,dx[i], 2);
            }
        }
        sum%=mod;
        out.println(sum);
    }

    private long calc(int pos, int[] prev, int cnt) {
        if (pos>n) {
            if (cnt==k) return 1;
            return 0;
        }
        if (cnt>k) return 0;
        int prevDynamicState = (prev[0]<<0) + (prev[1]<<1);
        if (used[pos][prevDynamicState][cnt]) return memo[pos][prevDynamicState][cnt];
        used[pos][prevDynamicState][cnt] = true;

        long sum = 0;
        for (int i=0; i<dx.length; i++) {
            if (dx[i][0]==dx[i][1]) {
                if (prev[0]==prev[1]) {
                    if (prev[0]!=dx[i][0]) {
                        sum+=calc(pos+1, dx[i], cnt+1);
                    } else {
                        sum+=calc(pos+1, dx[i], cnt);
                    }
                }else {
                    sum+=calc(pos+1, dx[i], cnt);
                }
            } else {
                if (dx[i][0]!=prev[0] && dx[i][1]!=prev[1]) {
                    sum+=calc(pos+1, dx[i], cnt+2);
                } else if (dx[i][0]==prev[0] && dx[i][1]==prev[1]) {
                    sum+=calc(pos+1, dx[i],cnt);
                } else {
                    sum+=calc(pos+1, dx[i], cnt+1);
                }
            }
        }
        sum%=mod;
        return memo[pos][prevDynamicState][cnt] = sum;
    }

    public class Pair {
        long x,y;
        public Pair (long x, long y) {
            this.x = x;
            this.y = y;
        }

    }

    String fileInName = "";

    boolean file = false;
    boolean isAcmp = false;

    static Throwable throwable;
    public static void main (String [] args) throws Throwable {
        Thread thread = new Thread(null, new Main(), "", (1 << 26));
        thread.start();
        thread.join();
        thread.run();
        if (throwable != null)
            throw throwable;
    }

    FastReader in;
    PrintWriter out;

    public void run() {
        String fileIn = "angle2.in";
        String fileOut = "angle2.out";

        try {
            if (isAcmp) {
                if (file) {
                    in = new FastReader(new BufferedReader(new FileReader(fileIn)));
                    out = new PrintWriter (fileOut);
                } else {
                    in = new FastReader(new BufferedReader(new InputStreamReader(System.in)));
                    out = new PrintWriter(System.out);
                }
            } else if (file) {
                in = new FastReader(new BufferedReader(new FileReader(fileInName+".in")));
                out = new PrintWriter (fileInName + ".out");
            } else {
                in = new FastReader(new BufferedReader(new InputStreamReader(System.in)));
                out = new PrintWriter(System.out);
            }

            solve();
        } catch(Exception e) {
            throwable = e;
        } finally {
            out.close();
        }

    }


}

class FastReader {
    BufferedReader bf;
    StringTokenizer tk = null;

    public FastReader(BufferedReader bf) {
        this.bf = bf;
    }

    public Integer nextInt() throws Exception {
        return Integer.parseInt(nextToken());
    }

    public Long nextLong() throws Exception {
        return Long.parseLong(nextToken());
    }

    public Double nextDouble() throws Exception {
        return Double.parseDouble(nextToken());
    }

    public String nextToken () throws Exception {
        if (tk==null || !tk.hasMoreTokens()) {
            tk = new StringTokenizer(bf.readLine());
        }
        if (!tk.hasMoreTokens()) return nextToken();
        else
            return tk.nextToken();
    }
}