Problem:
Score : 900 points

Problem Statement

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.

Sample Input 1

2 2

Sample Output 1

3

After two operations, there are three possible outcomes:

x=(2,4)

x=(3,3)

x=(4,2)

For example, x=(3,3) can result after the following sequence of operations:

First, choose i=0,j=1, changing x from (0,0) to (2,1).

Second, choose i=1,j=0, changing x from (2,1) to (3,3).

Sample Input 2

3 2

Sample Output 2

19

Sample Input 3

10 10

Sample Output 3

211428932

Sample Input 4

100000 50000

Sample Output 4

3463133

Solution in C++14 (GCC 5.4.1) (judge verdict: Accepted)

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int mod=998244353;
inline void add(int &x,int y){(x+=y)>=mod?x-=mod:0;}
inline int kpow(int a,int b)
{
	int s=1;
	for(;b;b>>=1,a=1ll*a*a%mod)
		if(b&1)s=1ll*s*a%mod;
	return s;
}
int n,m,ans,jc[2000010],jcv[2000010];
void init()
{
	jc[0]=1;
	for(int i=1;i<=2000000;++i)jc[i]=1ll*jc[i-1]*i%mod;
	jcv[2000000]=kpow(jc[2000000],mod-2);
	for(int i=2000000;i;--i)jcv[i-1]=1ll*jcv[i]*i%mod;
}
int C(int x,int y)
{
	if(x<y||y<0)return 0;
	return 1ll*jc[x]*jcv[y]%mod*jcv[x-y]%mod;
}
int calc(int a,int b,int s)
{
	int res=C(a+b+s-1,a+b-1);
	add(res,mod-1ll*b*C(a+b+s-2-m,a+b-1)%mod);
	add(res,mod-1ll*a*C(a+b+s-1-m,a+b-1)%mod);
	return res;
}
int main()
{
	scanf("%d %d",&n,&m);
	init();
	for(int i=m;i>=0;i-=2)add(ans,1ll*C(n,i)*calc(i,n-i,(3*m-i)/2)%mod)/*,printf("%d\n",ans)*/;
	printf("%d",ans);
	return 0;
}