Question

在一个二维平面坐标系上,有一个感染者在的位置。从 时刻开始,每一个在的感染者都会让下一个时刻的感染者数量增加

Solution

比赛的时候是打表+OEIS找规律出来的结果。
下面讲正解:
官方题解里说图片说明
然而我没有明白为什么可以这么转换,直到后来看了Lskkkno1写的证明才明白。
我们考虑地图和时间的关系,设表示时刻的感染者数量。

时刻感染者数量为:

  1. 时刻已有的量(不动)
  2. 时刻已有的量(往x方向走了一步)
  3. 时刻已有的量(往y方向走了一步)


然后这样子还是没法做的。这时候结合官方题解,把问题的模型转换为排列组合问题,答案就变成了
我们预处理分子分母,预处理分母的时候还需要用到费马小定理将
复杂度

Code

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int>P;
const double eps = 1e-8;
const int NINF = 0xc0c0c0c0;
const int INF  = 0x3f3f3f3f;
const ll  mod  = 998244353;
const ll  maxn = 1e6 + 5;
const int N = 5e3 + 5;

ll fac[N],ifac[N];

ll qpow(ll a,ll b){
    ll res=1;
    while(b>0){
        if(b&1) res=res*a%mod;
        a=a*a%mod;
        b>>=1;
    }
    return res;
}

void init(){
    fac[0]=1;
    for(int i=1;i<=N;i++) fac[i]=fac[i-1]*i%mod;
    ifac[N-1]=qpow(fac[N-1],mod-2);
    for(int i=N-2;i>=0;i--) ifac[i]=ifac[i+1]*(i+1)%mod;
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    init();
    int n;cin>>n;
    for(int i=1;i<=n;i++){
        int x,y,t;cin>>x>>y>>t;
        if(t<x+y) cout<<0<<'\n';
        else{
            cout<<fac[t]*ifac[t-x-y]%mod*ifac[x]%mod*ifac[y]%mod<<'\n';
        }
    }
    return 0;
}