先把 变成 , 不会影响答案 .
枚举最后持有 奇数 的人有 个, 总钱数为 ,
把所有 奇数 减去 , 总钱数变为 , 而剩下的人的财产均为 偶数,
设 , 把 分给 个人的方案数量(允许有人没钱) 即为对答案的贡献,
为 ,
但是钱数最多的人最多持有 的钱, 还需减去不合法的方案,
先减去 大于等于 的方案数, 先固定一个人至少拥有 的钱, 设 ,
方案数为: .
还要加上存在 等于 的方案数, .
- 为 奇数 时, 才可能出现仅有 个 奇数 的情况 .
- 固定一个人拥有 时, .
#include<bits/stdc++.h>
#define reg register
const int maxn = 3e7 + 5;
const int mod = 998244353;
int N;
int M;
int Ans;
int fac[maxn];
int inv[maxn];
int ifac[maxn];
int C(int n, int m){ if(n < m) return 0; return 1ll*fac[n]*ifac[m]%mod*ifac[n-m]%mod; }
int main(){
fac[0] = 1; for(reg int i = 1; i < maxn; i ++) fac[i] = 1ll*fac[i-1]*i % mod;
inv[1] = 1; for(reg int i = 2; i < maxn; i ++) inv[i] = ((-1ll*mod/i*inv[mod%i])%mod + mod)%mod;
ifac[0] = 1; for(reg int i = 1; i < maxn; i ++) ifac[i] = 1ll*ifac[i-1]*inv[i] % mod;
scanf("%d%d", &N, &M); int lim = std::min(N, M);
for(reg int i = (M&1); i <= lim; i += 2){
int n1 = (M*3-i)/2, n2 = (M-i)/2;
Ans = (Ans + 1ll*C(N, i)*C(n1+N-1, N-1)%mod) % mod;
Ans = ((Ans - 1ll*N*C(N, i)%mod*C(n2+N-1, N-1)%mod) + mod) % mod;
Ans = (Ans + 1ll*(N-i)*C(N, i)%mod*C(n2+N-2, N-2)%mod) % mod; //
}
printf("%d
", Ans);
return 0;
}