ARC102C 题解
intel_core · · 题解
考虑两数相加不为
在计算
然后考虑容斥,钦定
预处理组合数即可
#include<bits/stdc++.h>
using namespace std;
const int NR=4e3+10;
#define int long long
const int MOD=998244353;
int n,m,c[NR][NR],pw[NR];
void add(int &x,int y){x=(x+y)%MOD;}
signed main(){
cin>>n>>m;
pw[0]=1;
for(int i=1;i<=n;i++)pw[i]=pw[i-1]*2%MOD;
for(int i=0;i<=n+m;i++){
c[i][0]=1;
for(int j=1;j<=i;j++)c[i][j]=(c[i-1][j]+c[i-1][j-1])%MOD;
}
for(int i=2;i<=2*n;i++){
int x=min((i-1)/2,n-i/2),y=n-2*x-(i%2==0),z=(i%2==0),ans=0;
for(int j=0;j<=x;j++){
if(j&1)add(ans,-c[x][j]*pw[x-j]%MOD*(c[n-j-z-x+m-1][n-j-z-x-1]+z*c[n-j-z-x+m-2][n-j-z-x-1])%MOD);
else add(ans,c[x][j]*pw[x-j]%MOD*(c[n-j-z-x+m-1][n-j-z-x-1]+z*c[n-j-z-x+m-2][n-j-z-x-1])%MOD);
}
cout<<(ans+MOD)%MOD<<endl;
}
return 0;
}