【计数题】
【计数题】
mod 998244353
Grid Counting
https://codeforces.com/contest/2151/problem/D
题目大意
思路
注意到恰好一个:列放了就不能再放->每列最多一个
注意到第一行只能放最左边和最右边 (如果上一行没放)第二行必须靠里放两个...
那么每行能放的范围仅有\(i<=mid(j,n-j+1)\)
->那么在\((n+1)/2\)以下的行都不应该有数
->行数从后往前遍历肯定是递增的
代码
int n;
void solve(){
cin>>n;
vector<int> a(n+1,0);
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=n;i>(n+1)/2;i--){
if(a[i]>0){
cout<<0<<endl;
return;
}
}
//cout<<1<<endl;
i64 ans=1LL;
i64 cur=0;
for(int i=(n+1)/2;i>=1;i--){
if(i==((n+1)/2) && n%2) cur++;
else cur+=2;
if(cur<a[i]){
cout<<0<<endl;
return;
}
ans=ans*C(cur,a[i])%mod;
cur-=a[i];
}
if(cur!=0){
cout<<0<<endl;
return;
}
cout<<ans<<endl;
}