题解:AT_arc203_c [ARC203C] Destruction of Walls

· · 题解

分析

首先发现 0 \leq K \leq H+W,考虑分类讨论。

总墙数 p=(h-1)w+(w-1)h,从左上角走到右下角至少的步数 f=h+w-2

代码

#include<bits/stdc++.h>
using namespace std;
int t,n,m,k,jie[400005],inv[400005];
const int mod=998244353;
int qpow(int x,int y){
    int ans=1;
    while(y){
        if(y&1)ans=1ll*ans*x%mod;
        x=1ll*x*x%mod;
        y>>=1;
    }
    return ans;
}
long long C(int x,int y){
    if(x==0||y==0)return 1; 
    if(x==y)return 1;
    return 1ll*jie[x]*inv[x-y]%mod*inv[y]%mod;
} 
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    cin>>t;
    jie[0]=1;
    for(int i=1;i<=400000;i++){
        jie[i]=1ll*jie[i-1]*i%mod;
        inv[i]=qpow(jie[i],mod-2);
    }
    while(t--){
        cin>>n>>m>>k;
        int len=n+m-2;
        int ge=(1ll*(n-1)*m+1ll*(m-1)*n)%mod;
        if(k<len){
            cout<<"0\n";
            continue;
        }if(k==len){
            cout<<C(len,n-1)<<'\n';
            continue;
        }if(k==len+1){
            cout<<1ll*C(len,n-1)*(ge-len+mod)%mod<<"\n";
            continue;
        }
        cout<<(1ll*C(len,n-1)*(ge-len+mod)%mod*(ge-len-1+mod)%mod*inv[2]%mod-1ll*C(n+m-3,n-1)*(n-1)%mod+1ll*C(n+m-2,n+1)*(n-1)%mod+1ll*C(n+m-2,m+1)*(m-1)%mod+(long long)mod)%mod<<"\n"; 
    }
    return 0;
}