题解:AT_arc203_c

· · 题解

ARC203C

注意到加粗的 K\le H+W,分讨一下:

代码:

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

typedef long long ll;
const int mod=998244353;
inline int Mod(int x) { return x<0 ? x+mod : (x>=mod ? x-mod : x); }
inline void adm(int &x,int y) { x=Mod(x+y); }
inline int qmi(ll a,int b)
{
    ll res=1;
    while (b)
    {
        if (b&1) res=res*a%mod;
        a=a*a%mod;
        b>>=1;
    }
    return res;
}

const int N=400000;
int fac[N+10],infac[N+10];
inline int binom(int a,int b) 
{ 
    if (a<0 || b<0 || a<b) return 0;
    return (ll)fac[a]*infac[b]%mod*infac[a-b]%mod; 
}

int main()
{
    fac[0]=1;
    for (int i=1;i<=N;i++) fac[i]=(ll)fac[i-1]*i%mod;
    infac[N]=qmi(fac[N],mod-2);
    for (int i=N-1;i>=0;i--) infac[i]=(ll)infac[i+1]*(i+1)%mod;

    int T;
    cin >> T;
    while (T--)
    {
        int h,w,k;
        cin >> h >> w >> k;
        int t=(2ll*h*w-h-w-(h+w-2))%mod;
        if (k<h+w-2) cout << "0\n";
        else if (k==h+w-2) cout << binom(h+w-2,h-1) << "\n";
        else if (k==h+w-1) cout << 1ll*binom(h+w-2,h-1)*t%mod << "\n";
        else 
        {
            int u=1ll*binom(h+w-2,h-1)*t%mod*Mod(t-1)%mod*infac[2]%mod;
            int s=1ll*binom(h+w-4,h-2)*(h+w-3)%mod;

            int up=1ll*(h-1)*binom(h+w-2,w-3)%mod;
            int lft=1ll*(w-1)*binom(h+w-2,h-3)%mod;

            int ans=((ll)Mod(u-s)+up+lft)%mod;
            cout << ans << "\n";
        }
    }

    return 0;
}