【计数题】

【计数题】

mod 998244353

Grid Counting

https://codeforces.com/contest/2151/problem/D

题目大意

QQ_1758777718324

思路

注意到恰好一个:列放了就不能再放->每列最多一个
注意到第一行只能放最左边和最右边 (如果上一行没放)第二行必须靠里放两个...
那么每行能放的范围仅有\(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;
}
posted @ 2025-09-25 13:20  White_ink  阅读(3)  评论(0)    收藏  举报