#include<cstdio>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<algorithm>
using namespace std;
const int N=8005;
typedef long long ll;
const ll mod=998244353;

int power_mod(int a,int b)
{
	int ans=1;
	while (b) 
	{
		if (b&1) ans=(ll)ans*a%mod;
		a=(ll)a*a%mod;
		b>>=1;
	}
	return ans;
}
inline void MOD(int &x) {if (x>=mod) x-=mod;}


int n,m;

int dp[N*4],t[N*4],tmp[N*4];

int om[N*4],on[N*4],rev[N*4],len;
void init(int n)
{
	int l=0;
	len=1;
	while (len<n) len<<=1,l++;
	
	int g=power_mod(3,(mod-1)/len),inv=power_mod(g,mod-2);
	for (int i=0;i<len;i++) 
	{
		om[i]= i==0 ?1:(ll)om[i-1]*g%mod;
		on[i]= i==0 ?1:(ll)on[i-1]*inv%mod;
		rev[i]=(rev[i>>1]>>1)|((i&1)<<l-1);
	}
}
void ntt(int *a,int *om,int n)
{
	for (int i=0;i<n;i++) if (rev[i]>i) swap(a[i],a[rev[i]]);
	for (int len=2;len<=n;len<<=1) 
		for (int m=len/2,x,i=0;i<n;i+=len) 
			for (int j=0;j<m;j++) 
			{
				x=(ll)om[n/len*j]*a[i+j+m]%mod;
				MOD(a[i+j+m]=a[i+j]-x+mod);
				MOD(a[i+j]+=x);
			}
}
void dft(int *a) {ntt(a,om,len);}
void idft(int *a) 
{
	ntt(a,on,len);
	int inv=power_mod(len,mod-2);
	for (int i=0;i<len;i++) a[i]=(ll)a[i]*inv%mod;
}
int jc[N],ny[N];

int C(int n,int m) 
{
	return (ll)jc[n]*ny[m]%mod*ny[n-m]%mod;
}
int main()
{
	scanf("%d%d",&n,&m);
	init(n*2+1);
	
	jc[0]=jc[1]=ny[0]=ny[1]=1;
	for (int i=2;i<=n+2;i++) jc[i]=(ll)jc[i-1]*i%mod,ny[i]=(mod-mod/i)*ny[mod%i]%mod;
	for (int i=2;i<=n+2;i++) ny[i]=(ll)ny[i-1]*ny[i]%mod;
	

	for (int i=0;i<=n;i++) dp[i]=1;
	//dft(dp);idft(dp);
	//for (int i=0;i<=n;i++) printf("%d ",dp[i]);
	
	for (int i=2;i<=m;i++) 
	{
		for (int j=0;j<=n;j++) tmp[j]=(ll)dp[j]*ny[j]%mod,t[j]=ny[j+2];t[0]=0;
		for (int j=n+1;j<len;j++) tmp[j]=t[j]=0;
		
		dft(tmp),dft(t);
		for (int j=0;j<len;j++) tmp[j]=(ll)tmp[j]*t[j]%mod;
		idft(tmp);
		
		for (int j=0;j<=n;j++) 
			dp[j]=((ll)dp[j]*(j*(j+1)/2+1)+(ll)tmp[j]*jc[j+2])%mod;
			//,printf("dp[%d][%d]=%d\n",i,j,dp[j]);
	}
	int ans=0;
	for (int i=0;i<=n;i++) ans=((ll)dp[i]*C(n,i)+ans)%mod;
	printf("%d\n",ans);
	return 0;
}

### Prompt

Develop a solution in Cpp to the problem described below:

We have an N \times M grid. The square at the i-th row and j-th column will be denoted as (i,j). Particularly, the top-left square will be denoted as (1,1), and the bottom-right square will be denoted as (N,M). Takahashi painted some of the squares (possibly zero) black, and painted the other squares white.

We will define an integer sequence A of length N, and two integer sequences B and C of length M each, as follows:

* A_i(1\leq i\leq N) is the minimum j such that (i,j) is painted black, or M+1 if it does not exist.
* B_i(1\leq i\leq M) is the minimum k such that (k,i) is painted black, or N+1 if it does not exist.
* C_i(1\leq i\leq M) is the maximum k such that (k,i) is painted black, or 0 if it does not exist.



How many triples (A,B,C) can occur? Find the count modulo 998244353.

Constraints

* 1 \leq N \leq 8000
* 1 \leq M \leq 200
* N and M are integers.



Partial Score

* 1500 points will be awarded for passing the test set satisfying N\leq 300.

Constraints

* 1 \leq N \leq 8000
* 1 \leq M \leq 200
* N and M are integers.

Input

Input is given from Standard Input in the following format:


N M

Output

Print the number of triples (A,B,C), modulo 998244353.

Examples

Input

2 3


Output

64


Input

4 3


Output

2588


Input

17 13


Output

229876268


Input

5000 100


Output

57613837

### Response

```cpp
#include<cstdio>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<algorithm>
using namespace std;
const int N=8005;
typedef long long ll;
const ll mod=998244353;

int power_mod(int a,int b)
{
	int ans=1;
	while (b) 
	{
		if (b&1) ans=(ll)ans*a%mod;
		a=(ll)a*a%mod;
		b>>=1;
	}
	return ans;
}
inline void MOD(int &x) {if (x>=mod) x-=mod;}


int n,m;

int dp[N*4],t[N*4],tmp[N*4];

int om[N*4],on[N*4],rev[N*4],len;
void init(int n)
{
	int l=0;
	len=1;
	while (len<n) len<<=1,l++;
	
	int g=power_mod(3,(mod-1)/len),inv=power_mod(g,mod-2);
	for (int i=0;i<len;i++) 
	{
		om[i]= i==0 ?1:(ll)om[i-1]*g%mod;
		on[i]= i==0 ?1:(ll)on[i-1]*inv%mod;
		rev[i]=(rev[i>>1]>>1)|((i&1)<<l-1);
	}
}
void ntt(int *a,int *om,int n)
{
	for (int i=0;i<n;i++) if (rev[i]>i) swap(a[i],a[rev[i]]);
	for (int len=2;len<=n;len<<=1) 
		for (int m=len/2,x,i=0;i<n;i+=len) 
			for (int j=0;j<m;j++) 
			{
				x=(ll)om[n/len*j]*a[i+j+m]%mod;
				MOD(a[i+j+m]=a[i+j]-x+mod);
				MOD(a[i+j]+=x);
			}
}
void dft(int *a) {ntt(a,om,len);}
void idft(int *a) 
{
	ntt(a,on,len);
	int inv=power_mod(len,mod-2);
	for (int i=0;i<len;i++) a[i]=(ll)a[i]*inv%mod;
}
int jc[N],ny[N];

int C(int n,int m) 
{
	return (ll)jc[n]*ny[m]%mod*ny[n-m]%mod;
}
int main()
{
	scanf("%d%d",&n,&m);
	init(n*2+1);
	
	jc[0]=jc[1]=ny[0]=ny[1]=1;
	for (int i=2;i<=n+2;i++) jc[i]=(ll)jc[i-1]*i%mod,ny[i]=(mod-mod/i)*ny[mod%i]%mod;
	for (int i=2;i<=n+2;i++) ny[i]=(ll)ny[i-1]*ny[i]%mod;
	

	for (int i=0;i<=n;i++) dp[i]=1;
	//dft(dp);idft(dp);
	//for (int i=0;i<=n;i++) printf("%d ",dp[i]);
	
	for (int i=2;i<=m;i++) 
	{
		for (int j=0;j<=n;j++) tmp[j]=(ll)dp[j]*ny[j]%mod,t[j]=ny[j+2];t[0]=0;
		for (int j=n+1;j<len;j++) tmp[j]=t[j]=0;
		
		dft(tmp),dft(t);
		for (int j=0;j<len;j++) tmp[j]=(ll)tmp[j]*t[j]%mod;
		idft(tmp);
		
		for (int j=0;j<=n;j++) 
			dp[j]=((ll)dp[j]*(j*(j+1)/2+1)+(ll)tmp[j]*jc[j+2])%mod;
			//,printf("dp[%d][%d]=%d\n",i,j,dp[j]);
	}
	int ans=0;
	for (int i=0;i<=n;i++) ans=((ll)dp[i]*C(n,i)+ans)%mod;
	printf("%d\n",ans);
	return 0;
}

```