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: Runtime Error)

#include <bits/stdc++.h>

int main(){
    using namespace std;
    constexpr unsigned long MOD = 998244353;
    size_t N, M;
    cin >> N >> M;
    auto modpow = [&MOD](unsigned long a, unsigned long n, unsigned long b = 1) -> unsigned long{
        auto ret = b % MOD;
        a %= MOD;
        while(n){
            if(n & 1)(ret *= a) %= MOD;
            (a *= a) %= MOD;
            n >>= 1;
        }
        return ret;
    };
    auto modbinomial = [&MOD, &modpow](unsigned long n, unsigned long k) -> unsigned long{
        unsigned long ret = 1, den = 1;
        for(unsigned long i = 1; i <= k; ++i){
            (ret *= (n - i + 1)) %= MOD;
            (den *= i) %= MOD;
        }
        return modpow(den, MOD - 2, ret);
    };
    auto a = modbinomial(MOD - N, 3 * M) + N * modbinomial(MOD - N, M - 1);
    a = M & 1 ? MOD - a % MOD : a % MOD;
    //if(M + 1 < N){
    auto ub = min(N, 3 * M), lb = M, sz = (ub - lb) / 2;
    if(ub > lb){
        vector<unsigned long> A(sz), B(sz);
        {
            auto k = M + 2;
            auto nn = N, dd = k;
            A[0] = modbinomial(nn, dd);
            for(unsigned long i = 1; i < sz; ++i){
                A[i] = modpow((dd + 1) * (dd + 2), MOD - 2, A[i - 1] * (nn - dd) % MOD * (nn - dd - 1));
                dd += 2;
            }
        }
        {
            auto nn = N - 1 + (3 * M - (ub & ~(ub & 1))) / 2, dd = N - 1;
            B.back() = modbinomial(nn, dd);
            for(unsigned long i = sz - 1; i--; ++nn)B[i] = modpow(nn - dd + 1, MOD - 2, B[i + 1] * (nn + 1));
        }
        a += MOD - inner_product(A.begin(), A.end(), B.begin(), 0UL, plus<>(), [&MOD](auto a, auto b){return a * b % MOD;}) % MOD;
    }
    cout << a % MOD << endl;
    return 0;
}