#include <bits/stdc++.h>
using namespace std;
typedef long long LL;

const int mod=998244353;
inline int add(int x,int y) {return (x+y>=mod) ? (x+y-mod) : (x+y);}
inline int dec(int x,int y) {return (x-y<0) ? (x-y+mod) : (x-y);}
inline int mul(int x,int y) {return (LL)x*y%mod;}
inline int power(int a,int b,int rs=1) {for(;b;b>>=1,a=mul(a,a)) if(b&1) rs=mul(rs,a); return rs;}
const int N=2e6+50;
struct combin {
	int fac[N], ifac[N];
	combin() {
		fac[0]=1; 
		for(int i=1;i<N;i++) fac[i]=mul(fac[i-1],i);
		ifac[N-1]=power(fac[N-1], mod-2);
		for(int i=N-2;~i;i--) ifac[i]=mul(ifac[i+1],i+1);
	}	
	inline int C(int a,int b) {if(a<b) return 0; return mul(fac[a],mul(ifac[b],ifac[a-b]));}
} C;

int n,m;
int main() {
	cin>>n>>m;
	int ans1=C.C(m+n-1,n-1);
	ans1=dec(ans1,n);
	int ans=0;
	for(int i=0;i<=m;i++) { //odd
		if(i%2!=m%2) continue;
		int even=(m-i)/2+m;
		int sum=C.C(even+n-1,n-1);
		sum=dec(sum,mul(n,C.C(even-m+n-1,n-1)));
		ans=add(ans,mul(sum,C.C(n,i)));
 	}
	ans=add(ans,mul(n,C.C(m+n-2,n-2)));
	cout<<ans<<'\n';
}
### Prompt

Develop a solution in CPP to the problem described below:

We have a sequence of N integers: x=(x_0,x_1,\cdots,x_{N-1}). Initially, x_i=0 for each i (0 \leq i \leq N-1).

Snuke will perform the following operation exactly M times:

* Choose two distinct indices i, j (0 \leq i,j \leq N-1,\ i \neq j). Then, replace x_i with x_i+2 and x_j with x_j+1.



Find the number of different sequences that can result after M operations. Since it can be enormous, compute the count modulo 998244353.

Constraints

* 2 \leq N \leq 10^6
* 1 \leq M \leq 5 \times 10^5
* All values in input are integers.

Input

Input is given from Standard Input in the following format:


N M


Output

Print the number of different sequences that can result after M operations, modulo 998244353.

Examples

Input

2 2


Output

3


Input

3 2


Output

19


Input

10 10


Output

211428932


Input

100000 50000


Output

3463133

### Response

```cpp
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;

const int mod=998244353;
inline int add(int x,int y) {return (x+y>=mod) ? (x+y-mod) : (x+y);}
inline int dec(int x,int y) {return (x-y<0) ? (x-y+mod) : (x-y);}
inline int mul(int x,int y) {return (LL)x*y%mod;}
inline int power(int a,int b,int rs=1) {for(;b;b>>=1,a=mul(a,a)) if(b&1) rs=mul(rs,a); return rs;}
const int N=2e6+50;
struct combin {
	int fac[N], ifac[N];
	combin() {
		fac[0]=1; 
		for(int i=1;i<N;i++) fac[i]=mul(fac[i-1],i);
		ifac[N-1]=power(fac[N-1], mod-2);
		for(int i=N-2;~i;i--) ifac[i]=mul(ifac[i+1],i+1);
	}	
	inline int C(int a,int b) {if(a<b) return 0; return mul(fac[a],mul(ifac[b],ifac[a-b]));}
} C;

int n,m;
int main() {
	cin>>n>>m;
	int ans1=C.C(m+n-1,n-1);
	ans1=dec(ans1,n);
	int ans=0;
	for(int i=0;i<=m;i++) { //odd
		if(i%2!=m%2) continue;
		int even=(m-i)/2+m;
		int sum=C.C(even+n-1,n-1);
		sum=dec(sum,mul(n,C.C(even-m+n-1,n-1)));
		ans=add(ans,mul(sum,C.C(n,i)));
 	}
	ans=add(ans,mul(n,C.C(m+n-2,n-2)));
	cout<<ans<<'\n';
}
```