news 2026/4/29 19:33:49

【牛客练习赛 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/29 18:09:57

WAF的API防护功能能抵御接口攻击吗?

WAF的API防护功能专门设计用于识别和拦截针对API接口的各种攻击。通过多层次的检测机制和智能规则匹配&#xff0c;能够有效防范SQL注入、XSS跨站脚本、暴力破解等常见威胁。企业可根据业务需求灵活配置防护策略&#xff0c;确保API接口安全稳定运行。WAF如何识别API攻击行为&a…

作者头像 李华
网站建设 2026/4/27 4:06:42

22、DB2 应用开发入门指南

DB2 应用开发入门指南 1. Python 操作 DB2 数据库练习 在这个练习中,我们将实践编写一个小型 Python 脚本来访问 SAMPLE 数据库中的数据。具体步骤如下: 1. 登录服务器 :以实例所有者的身份登录服务器。在 Linux 上通常是 db2inst1 ,在 Windows 上通常是 db2admin …

作者头像 李华
网站建设 2026/4/29 13:17:57

什么是负载均衡?不就是加台服务器嘛!

你是小阿巴&#xff0c;刚刚开发上线了自己的第一个网站。 前几天只有几个人访问&#xff0c;网站运行得稳稳当当。 你得意地想&#xff1a;做网站也太简单了吧&#xff01; 结果一周后&#xff0c;某知名博主 “鱼蛋” 不小心推广了 你的网站&#xff0c;突然来了 1 万个用户…

作者头像 李华
网站建设 2026/4/26 3:41:44

19、深入了解 DB2 应用程序开发:PHP 与 Perl 的实践指南

深入了解 DB2 应用程序开发:PHP 与 Perl 的实践指南 1. PHP 与 DB2 应用开发基础 在使用 PHP 进行 DB2 应用开发时,首先要掌握基本的数据库连接和资源管理。以下是一个使用 PDO_ODBC 连接到 DB2 数据库并释放连接资源的示例代码: // for PDO_ODBC $dbh = new PDO(odbc:s…

作者头像 李华
网站建设 2026/4/26 21:40:17

LC.1008 | 前序遍历构造二叉搜索树 | 树 | 递归遍历

输入&#xff1a; 一个整数数组 preorder&#xff0c;代表二叉搜索树的先序遍历结果。 要求&#xff1a; 根据给定的先序遍历还原出二叉搜索树&#xff08;BST&#xff09;。 BST 的性质是&#xff1a;对于任意节点&#xff0c;左子树所有节点值 < 当前节点值 < 右子树所…

作者头像 李华