news 2026/4/16 13:16:24

【牛客练习赛 62】B题【病毒扩散】题解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【牛客练习赛 62】B题【病毒扩散】题解

题目链接

题目大意

牛牛所在的城市有一种新型病毒开始扩散。在一个二维平面坐标系上,有一个感染者在( 0 , 0 ) (0, 0)(0,0)的位置。从时刻0 00开始,每一个在( x , y ) (x, y)(x,y)的感染者都会让下一个时刻( x , y + 1 ) , ( x + 1 , y ) (x, y + 1), \ (x + 1, y)(x,y+1),(x+1,y)感染者数量增加1 11

牛牛想知道,对于特殊的n nn个点( x , y ) (x, y)(x,y),在时刻t tt感染者的数量。

数据范围

Solution

根据题意,我们可以设f ( t , x , y ) f(t, x, y)f(t,x,y)表示t tt时刻( x , y ) (x, y)(x,y)感染者的数量。

递推式

f ( t , x , y ) = f ( t − 1 , x , y ) + f ( t − 1 , x − 1 , y ) + f ( t − 1 , x , y − 1 ) . f(t, x, y) = f(t - 1, x, y) + f(t - 1, x - 1, y) + f(t - 1, x, y - 1).f(t,x,y)=f(t1,x,y)+f(t1,x1,y)+f(t1,x,y1).

边界条件

f ( 0 , x , y ) = { 1 , ( x , y ) = ( 0 , 0 ) 0 , ( x , y ) ≠ ( 0 , 0 ) . f(0, x, y) = \begin{cases} 1,& (x, y) = (0, 0) \\ 0,& (x, y) \neq (0, 0). \end{cases}f(0,x,y)={1,0,(x,y)=(0,0)(x,y)=(0,0).

归纳法

下面证明( 1 ) (1)(1)成立
f ( t , x , y ) = ( t x ) ( t − x y ) . (1) f(t, x, y) = {t \choose x}{t - x \choose y}. \tag{1}f(t,x,y)=(xt)(ytx).(1)

t = 0 t = 0t=0时显然成立。

t = k t = kt=k
f ( k , x , y ) = ( k x ) ( k − x y ) , f(k, x, y) = {k \choose x}{k - x \choose y},f(k,x,y)=(xk)(ykx),

那么当t = k + 1 t = k + 1t=k+1时,
f ( k + 1 , x , y ) = f ( k , x , y ) + f ( k , x − 1 , y ) + f ( k , x , y − 1 ) = ( k x ) ( k − x y ) + ( k x − 1 ) ( k − x + 1 y ) + ( k x ) ( k − x y − 1 ) = k ! x ! y ! ( k − x − y ) ! + k ! ( x − 1 ) ! y ! ( k − x − y + 1 ) ! + k ! x ! ( y − 1 ) ! ( k − x − y + 1 ) ! = k ! ( ( k − x − y + 1 ) + x + y ) x ! y ! ( k − x − y + 1 ) ! = ( k + 1 ) ! x ! y ! ( k + 1 − x − y ) ! = ( k + 1 ) ! x ! ( k + 1 − x ) ! ⋅ ( k + 1 − x ) ! y ! ( k + 1 − x − y ) ! = ( k + 1 x ) ( k + 1 − x y ) . \begin{align*} f(k + 1, x, y) &= f(k, x, y) + f(k, x - 1, y) + f(k, x, y - 1) \\ &= {k \choose x}{k - x \choose y} + {k \choose x - 1}{k - x + 1 \choose y} + {k \choose x}{k - x \choose y - 1} \\ &= \frac{k!}{x!\ y!\ (k - x - y)!} + \frac{k!}{(x - 1)!\ y!\ (k - x - y + 1)!} + \frac{k!}{x!\ (y - 1)!\ (k - x - y + 1)!} \\ &= \frac{k!\ ((k - x - y + 1) + x + y)}{x!\ y!\ (k - x - y + 1)!} \\ &= \frac{(k + 1)!}{x!\ y!\ (k + 1 - x - y)!} \\ &= \frac{(k + 1)!}{x!\ (k + 1 - x)!}\cdot \frac{(k + 1 - x)!}{y!\ (k + 1 - x - y)!} \\ &= {k + 1 \choose x}{k + 1 - x \choose y}. \end{align*}f(k+1,x,y)=f(k,x,y)+f(k,x1,y)+f(k,x,y1)=(xk)(ykx)+(x1k)(ykx+1)+(xk)(y1kx)=x!y!(kxy)!k!+(x1)!y!(kxy+1)!k!+x!(y1)!(kxy+1)!k!=x!y!(kxy+1)!k!((kxy+1)+x+y)=x!y!(k+1xy)!(k+1)!=x!(k+1x)!(k+1)!y!(k+1xy)!(k+1x)!=(xk+1)(yk+1x).

所以( 1 ) (1)(1)式成立。

时间复杂度O ( max ⁡ ( t , x , y ) + n ) = O ( n ) O(\max(t, x, y) + n) = O(n)O(max(t,x,y)+n)=O(n)

C++ Code

#include<bits/stdc++.h>usingi64=longlong;constexprintN=5000;constexprintP=998244353;std::array<int,N+1>fac{};std::array<int,N+1>inv{};std::array<int,N+1>ifac{};voidinit(){fac[0]=1;for(inti=1;i<=N;i++){fac[i]=1LL*fac[i-1]*i%P;}inv[0]=inv[1]=1;for(inti=2;i<=N;i++){inv[i]=1LL*(P-P/i)*inv[P%i]%P;}ifac[0]=ifac[1]=1;for(inti=2;i<=N;i++){ifac[i]=1LL*ifac[i-1]*inv[i]%P;}}intbinom(intn,intm){if(n<0orn<m){return0;}return1LL*fac[n]*ifac[m]%P*ifac[n-m]%P;}intmain(){std::ios::sync_with_stdio(false);std::cin.tie(nullptr);init();intn;std::cin>>n;for(inti=0;i<n;i++){intx,y,t;std::cin>>x>>y>>t;std::cout<<1LL*binom(t,x)*binom(t-x,y)%P<<"\n";}return0;}

Appendix

代码中用到的组合数预处理仅在模数为质数的情况下用到,如模数不是质数,需要用递推式( 2 ) (2)(2)进行O ( n 2 ) O(n^2)O(n2)预处理。
( n m ) = ( n − 1 m ) + ( n − 1 m − 1 ) . (2) {n \choose m} = {n - 1 \choose m} + {n - 1 \choose m - 1}. \tag{2}(mn)=(mn1)+(m1n1).(2)

代码中,fac \text{fac}fac表示阶乘,inv \text{inv}inv表示逆元,ifac \text{ifac}ifac表示阶乘的逆元。

关于逆元的O ( 1 ) O(1)O(1)求法,下面给出说明。

首先,特别规定0 − 1 = 1 − 1 = 1 0^{-1} = 1^{-1} = 101=11=1,方便后续处理和推导。

要求i ( i > 1 ) i\ (i > 1)i(i>1)在模P PP意义下的逆元,设P = k i + r ( 0 ≤ r < i ) P = ki + r\ (0 \leq r < i)P=ki+r(0r<i),那么就有
k i + r ≡ 0 ( m o d P ) . ki + r \equiv 0 \pmod{P}.ki+r0(modP).

移项r rr得到
k i ≡ − r ( m o d P ) . ki \equiv -r \pmod{P}.kir(modP).

两边同时乘以r rr的逆元r − 1 r^{-1}r1,再乘以− 1 -11,得到
− k r − 1 i ≡ 1 ( m o d P ) . -kr^{-1}i \equiv 1 \pmod{P}.kr1i1(modP).

两边同时乘以i ii的逆元 $i^{-1},得到
− k r − 1 ≡ i − 1 ( m o d P ) . -kr^{-1} \equiv i^{-1} \pmod{P}.kr1i1(modP).

所以i ii的逆元i − 1 i^{-1}i1− k r − 1 ( m o d P ) -kr^{-1}\pmod{P}kr1(modP),把k = ⌊ P i ⌋ k = \left\lfloor \dfrac{P}{i} \right\rfloork=iPr = P mod i r = P \ \text{mod} \ ir=Pmodi代入得到
i − 1 ≡ − ⌊ P i ⌋ ( P mod i ) − 1 ( m o d P ) . i^{-1} \equiv -\left\lfloor \dfrac{P}{i} \right\rfloor (P \ \text{mod} \ i)^{-1} \pmod {P}.i1iP(Pmodi)1(modP).

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/14 6:29:48

扫黑除恶!网络安全实战攻略分享

扫黑除恶&#xff01;网络安全实战攻略分享 首先&#xff0c;对于网络安全初学者&#xff0c;选择适合的方向和方法至关重要&#xff01;有的同学完全没有计算机功底&#xff0c;上来就去学渗透、学逆向破解App&#xff0c;结果折腾半天&#xff0c;学了点皮毛就被“劝退”了。…

作者头像 李华
网站建设 2026/4/16 12:45:59

必藏!程序员入门大模型:避开3大误区,4步高效通关

当大模型从技术热点变成产业刚需&#xff0c;越来越多程序员将其列为“必学技能”。但不少人刚踏上学习路就陷入迷茫&#xff1a;对着复杂的数学公式望而却步&#xff0c;跟风学了一堆工具却不会落地&#xff0c;囤了满盘资料最终半途而废。其实对程序员而言&#xff0c;大模型…

作者头像 李华
网站建设 2026/4/16 9:10:33

LobeChat能否集成New Relic?应用性能监控方案

LobeChat 能否集成 New Relic&#xff1f;应用性能监控方案 在现代 AI 应用快速落地的背景下&#xff0c;一个看似简单的聊天界面背后&#xff0c;往往隐藏着复杂的调用链&#xff1a;用户输入 → 前端渲染 → API 网关 → 模型路由 → 插件执行 → 第三方服务 → 流式返回。当…

作者头像 李华
网站建设 2026/4/12 15:39:59

茶饮巨头也缺人?揭秘“日结”如何成为灵活用工的招聘必杀技

门店“业绩标杆”的隐形危机&#xff1a;发薪速度正成为招聘拦路虎老王是一家全球头部茶饮咖啡品牌的资深餐厅经理&#xff0c;他管理的门店向来是区域内的“业绩标杆”。然而&#xff0c;在最近的周会上&#xff0c;这位经验丰富的店长却罕见地向总部求援&#xff1a;“下周末…

作者头像 李华
网站建设 2026/4/15 3:48:40

零工总是“鸽”?看这家平台如何用“尊重”换取99%的履约率

灵活用工管理变革&#xff1a;如何用“松弛感”换取供应商的“安全感”&#xff1f;在灵活用工行业&#xff0c;供应商最头疼的莫过于人员的不稳定性。然而&#xff0c;通过盖雅零工管家的实践案例&#xff0c;我们发现&#xff1a;给零工“自由”&#xff0c;恰恰是企业获得“…

作者头像 李华