E869120 defined a sequence $a$ like this:


* $a_1=a_2=1$, $a_{k+2}=a_{k+1}+a_k \ (k \ge 1)$


He also defined sequences $d_1, d_2, d_3, \dots , d_n$, as the following recurrence relation :


* $d_{1, j} = a_j$
* $d_{i, j} = \sum_{k = 1}^j d_{i - 1, k} \ (i \ge 2)$


You are given integers $n$ and $m$. Please calculate the value of $d_{n, m}$.
Since the answer can be large number, print the answer modulo $998,244,353$.
Can you solve this problem???

Input

The input is given from standard input in the following format.



> $n \quad m$

Output

* Print $d_{n, m}$ modulo $998,244,353$.



Constraints

* $1 \le n \le 200,000$
* $1 \le m \le 10^{18}$



Subtasks

Subtask 1 [ $100$ points ]


* The testcase in this subtask satisfies $1 \le n, m \le 3,000$.

Subtask 2 [ $170$ points ]


* The testcase in this subtask satisfies $1 \le m \le 200,000$.

Subtask 3 [ $230$ points ]


* The testcase in this subtask satisfies $1 \le n \le 3$.

Subtask 4 [ $420$ points ]


* The testcase in this subtask satisfies $1 \le n \le 1000$.

Subtask 5 [ $480$ points ]


* There are no additional constraints.

Output

* Print $d_{n, m}$ modulo $998,244,353$.



Constraints

* $1 \le n \le 200,000$
* $1 \le m \le 10^{18}$



Subtasks

Subtask 1 [ $100$ points ]


* The testcase in this subtask satisfies $1 \le n, m \le 3,000$.

Subtask 2 [ $170$ points ]


* The testcase in this subtask satisfies $1 \le m \le 200,000$.

Subtask 3 [ $230$ points ]


* The testcase in this subtask satisfies $1 \le n \le 3$.

Subtask 4 [ $420$ points ]


* The testcase in this subtask satisfies $1 \le n \le 1000$.

Subtask 5 [ $480$ points ]


* There are no additional constraints.

Input

The input is given from standard input in the following format.



> $n \quad m$

Examples

Input

4 7


Output

176


Input

12 20


Output

174174144


Input

16 30


Output

102292850
#include <stdio.h>

using namespace std;

using ll = long long;

#define rep(i, n) for(int i = 0; i < n; i++)

const ll mod = 998244353;

class matrix {
public:
  ll d[2][2];
  matrix operator*(const matrix& m) {
    matrix r;
    rep(i, 2) {
      rep(j, 2) {
        r.d[i][j] = 0;
      }
    }
    rep(i, 2) {
      rep(j, 2) {
        rep(k, 2) {
          r.d[i][j] = (r.d[i][j] + d[i][k] * m.d[k][j]) % mod;
        }
      }
    }
    return r;
  }
};

ll fibo(ll n) {
  matrix r;
  rep(i, 2) {
    rep(j, 2) {
      if(i == j) {
        r.d[i][j] = 1;
      }
      else {
        r.d[i][j] = 0;
      }
    }
  }
  matrix m;
  m.d[0][0] = 1;
  m.d[0][1] = 1;
  m.d[1][0] = 1;
  m.d[1][1] = 0;
  while(n > 0) {
    if(n & 1) {
      r = r * m;
    }
    m = m * m;
    n >>= 1;
  }
  return r.d[1][0];
}

ll inv(ll n) {
  ll r = 1;
  ll w = mod - 2;
  while(w > 0) {
    if(w & 1) {
      r = (r * n) % mod;
    }
    n = (n * n) % mod;
    w >>= 1;
  }
  return r;
}

int main() {
  ll n, m;
  scanf("%lld%lld", &n, &m);
  ll a = fibo(m + (n - 1) * 2);
  ll now = 1;
  ll l = m + (n - 1) * 2 - 1;
  ll r = 0;
  for(int i = 2; i <= n; i++) {
    a = (a + mod - now) % mod;
    now = (now * ((l - r) % mod)) % mod;
    now = (now * ((l - r - 1) % mod)) % mod;
    now = (now * inv(l % mod)) % mod;
    now = (now * inv(r + 1)) % mod;
    l--;
    r++;
  }
  printf("%lld\n", a);
}
