news 2026/6/15 17:56:52

【牛客练习赛 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/6/15 13:51:06

美容/心理咨询/问诊/法律咨询/牙医预约/线上线下预约/牙医行业通用医疗预约咨询小程序

在数字化医疗快速发展的今天&#xff0c;一款集预约、诊疗、优惠于一体的一站式口腔健康服务平台应运而生。本平台基于ThinkPHP后端框架、MySQL数据库、uniapp小程序前端及Vue.js技术栈打造&#xff0c;为患者提供便捷、高效、专业的口腔医疗服务体验。接下来&#xff0c;我们将…

作者头像 李华
网站建设 2026/6/15 1:37:49

LobeChat能否对接Redis缓存提升性能?技术实现细节

LobeChat 对接 Redis 缓存的性能优化实践 在现代 AI 应用中&#xff0c;响应速度与系统稳定性往往直接决定用户体验。以 LobeChat 为例&#xff0c;作为一款基于 Next.js 构建的开源大模型交互框架&#xff0c;它支持多模型接入、插件扩展和丰富的会话功能&#xff0c;已成为许…

作者头像 李华
网站建设 2026/6/15 7:45:00

【收藏】Java程序员转型AI大模型:从入门到进阶的全攻略

在AI大模型技术席卷各行各业的当下&#xff0c;传统Java程序员面临着职业发展的新抉择——是坚守原有技术赛道&#xff0c;还是抓住机遇切入大模型领域实现职业升级&#xff1f;答案显而易见&#xff0c;转型AI大模型不仅能突破技术瓶颈&#xff0c;更是提升职业竞争力、实现薪…

作者头像 李华
网站建设 2026/6/15 12:14:57

NAS读取延时问题深度解析:NFS缓存机制与优化实战

在分布式存储场景中&#xff0c;NAS设备通过NFS协议实现多客户端共享访问时&#xff0c;常遇到文件更新后其他客户端无法立即感知的延迟问题。本文结合真实案例与技术原理&#xff0c;系统解析NFS缓存机制对数据一致性的影响&#xff0c;并提供可落地的优化方案。一、典型问题场…

作者头像 李华
网站建设 2026/6/15 17:24:49

Linux swap分区设置对Qwen3-32B内存溢出的影响

Linux swap分区设置对Qwen3-32B内存溢出的影响 在AI模型部署一线&#xff0c;你可能遇到过这样的场景&#xff1a;一台配置64GB内存的服务器上启动Qwen3-32B推理服务&#xff0c;刚加载完模型就触发OOM Killer&#xff0c;进程被无情终止。查看日志发现&#xff0c;系统明明还有…

作者头像 李华