news 2026/6/10 12:30:25

【牛客练习赛 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/10 1:50:20

直流耦合1G采集卡

1GS/s采样率 14bit分辨率 1/2/4通道同步采集&#xff0c;高采样率&#xff08;1GS/s&#xff09;与高分辨率&#xff08;14bit&#xff09;的高速数字化仪/高速数据采集卡。集成直流耦合程控放大器&#xff0c;支持双极性宽带信号输入&#xff0c;具备高动态范围采集能力。该…

作者头像 李华
网站建设 2026/6/10 2:10:47

大模型压缩技术全解析:从剪枝到量化,程序员必学收藏指南

本文详细介绍了大模型压缩技术&#xff0c;包括剪枝(移除冗余连接)、量化(降低数值精度)和知识蒸馏(教师-学生模式)三大核心方法&#xff0c;并推荐了"知识蒸馏→剪枝→量化"的组合优化流程。通过系统压缩技术&#xff0c;可将庞大模型转化为轻量化模型&#xff0c;实…

作者头像 李华
网站建设 2026/6/10 14:25:33

LC.701 | 二叉搜索树中的插入操作 | 树 | 迭代模拟

输入&#xff1a; 二叉搜索树的根节点 root 和一个待插入的整数 val。 要求&#xff1a; 将 val 插入到二叉搜索树中&#xff0c;并保证插入后整棵树仍然满足 BST 的性质&#xff08;左 < 根 < 右&#xff09;。 题目保证新值和原始树中任意节点值都不同。 输出&#xff…

作者头像 李华
网站建设 2026/6/10 16:13:05

多元异构数据库管理:从“人肉运维”到统一平台的省心之路

在当前企业数字化转型的浪潮下&#xff0c;一个普遍的技术现实是&#xff1a;几乎不存在完全单一的数据技术栈。从传统的Oracle、MySQL到新兴的Redis、MongoDB、ClickHouse&#xff0c;再到各类国产数据库&#xff0c;多元异构的数据库环境已成为企业数据架构的常态。面对这种复…

作者头像 李华
网站建设 2026/6/10 16:07:24

LobeChat能否接入微信机器人?实现路径技术推演

LobeChat 能否接入微信机器人&#xff1f;技术实现路径深度解析 在智能对话系统加速落地的今天&#xff0c;越来越多开发者开始思考&#xff1a;如何让私有化部署的大模型助手走出浏览器&#xff0c;真正融入用户的日常沟通场景&#xff1f;一个高频需求浮出水面——能否将像 L…

作者头像 李华