考虑差分.
.
对于%来说.
显然除了第项和第项可以是任意模中的一个外.其他只能是.
通过调节最大值的大小.
然后可以通过枚举,枚举的数量来确定另外一个的数量.
比方说我枚举的数量为,那么的数量就是,剩余分配数量为.
两种情况:
%为.可以分配. 那么就是相当于个空隙分配块板子.方案数就是.
%不为. 不可以分配.直接退出.
code:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e7+5;
const int mod=998244353;
int f[N],ivf[N];
int qp(int a,int b)
{
int res=1;
while(b)
{
if(b&1) res=1ll*res*a%mod;
a=1ll*a*a%mod;
b>>=1;
}
return res;
}
int C(int a,int b)
{
return 1ll*f[a]*ivf[b]%mod*ivf[a-b]%mod;
}
void run()
{
f[0]=1;int m=2e7;
for(int i=1;i<=m;i++) f[i]=1ll*f[i-1]*i%mod;
ivf[m]=qp(f[m],mod-2);
for(int i=m-1;i>=0;i--) ivf[i]=1ll*ivf[i+1]*(i+1)%mod;
int ans=0;
int n;
scanf("%d%d",&n,&m);
for(int i=0;i<3;i++)
{
for(int j=0;j<3;j++)
{
for(int c=0;c<n;c++)
{
int d=2*(n-1-c);
int num=m-i-j-c-d;
if(num<0||num%3!=0) continue;
ans+=1ll*C(n-1,c)*C(n+num/3,n)%mod;
ans%=mod;
}
}
}
printf("%d\n",ans);
}
int main()
{
int T=1;
// scanf("%d",&T);
while(T--) run();
return 0;
}