Question
在一个二维平面坐标系上,有一个感染者在的位置。从 时刻开始,每一个在的感染者都会让下一个时刻,的感染者数量增加。
Solution
比赛的时候是打表+OEIS找规律出来的结果。
下面讲正解:
官方题解里说
然而我没有明白为什么可以这么转换,直到后来看了Lskkkno1写的证明才明白。
我们考虑地图和时间的关系,设表示在时刻的感染者数量。
在时刻感染者数量为:
- 在时刻已有的量(不动)
- 在时刻已有的量(往x方向走了一步)
- 在时刻已有的量(往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; }