题解:CF2150B Grid Counting
题解:CF2150B Grid Counting
思路
首先,因为题目的第二、三条限制,每个
首先,我们必须在
那么,在
接下来考虑第二、三条限制
以此类推,最终能选的格子即为下图:
其中黑色为必选的部分,灰色为可选的部分(每列选一个)。
那么接下来我们倒序枚举
代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod=998244353;
int t,n,a[200010];
ll f[200010];
ll qpow(ll a,ll b){
ll ans=1;
for(;b;b>>=1,a=a*a%mod)if(b&1)ans=ans*a%mod;
return ans;
}
ll C(ll n,ll m){
if(n<m)return 0;
return f[n]*qpow(f[m],mod-2)%mod*qpow(f[n-m],mod-2)%mod;
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
f[0]=1;
for(int i=1;i<=200000;i++)f[i]=f[i-1]*i%mod;
cin>>t;
while(t--){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
int cnt=0,fl=1;
ll ans=1;
for(int i=n;i>=1;i--){
if(i*2==n+1)cnt++;
else if(i*2<=n)cnt+=2;
if(cnt<a[i]){
fl=0;
break;
}
ans=ans*C(cnt,a[i])%mod;
cnt-=a[i];
}
if(cnt!=0||!fl){
cout<<"0\n";
}
else{
cout<<ans<<'\n';
}
}
return 0;
}