EagleBear2002 的博客

这里必须根绝一切犹豫,这里任何怯懦都无济于事

P4007 小 Y 和恐怖的奴隶主

题目背景

“A fight? Count me in!” 要打架了,算我一个。

“Everyone, get in here!” 所有人,都过来!

题目描述

小 Y 是一个喜欢玩游戏的 OIer。一天,她正在玩一款游戏,要打一个 Boss。

虽然这个 Boss 有 10100 点生命值,但它只带了一个随从——一个只有 m 点生命值的“恐怖的奴隶主”。

这个“恐怖的奴隶主”有一个特殊的技能:每当它被扣减生命值但没有死亡(死亡即生命值 0),且 Boss 的随从数量小于上限 k,便会召唤一个新的具有 m 点生命值的“恐怖的奴隶主”。

现在小 Y 可以进行 n 次攻击,每次攻击时,会从 Boss 以及 Boss 的所有随从中的等概率随机选择一个,并扣减 1 点生命值,她想知道进行 n 次攻击后扣减 Boss 的生命值点数的期望。为了避免精度误差,你的答案需要对 998244353 取模。

输入格式

输入第一行包含三个正整数 T,m,kT 表示询问组数,m,k 的含义见题目描述。

接下来 T 行,每行包含一个正整数 n,表示询问进行 n 次攻击后扣减 Boss 的生命值点数的期望。

输出格式

输出共 T 行,对于每个询问输出一行一个非负整数,表示该询问的答案对 998244353 取模的结果。

可以证明,所求期望一定是一个有理数,设其为 p/q (gcd(p,q)=1),那么你输出的数 x 要满足 pqx(mod998244353)

输入输出样例 #1

输入 #1

1
2
3
4
3 2 6
1
2
3

输出 #1

1
2
3
499122177
415935148
471393168

说明/提示

【样例 1 解释】

对于第一次询问,第一次攻击有 12 的概率扣减 Boss 的生命值,有 12 的概率扣减随从的生命值,所以答案为 1212×499122177(mod998244353)

对于第二次询问,如果第一次攻击扣减了 Boss 的生命值,那么有 12 的概率第二次攻击仍扣减 Boss 的生命值,有 12 的概率第二次攻击扣减随从的生命值;如果第一次攻击扣减了随从的生命值,那么现在又新召唤了一个随从(“恐怖的奴隶主”),于是有 13 的概率第二次攻击扣减 Boss 的生命值,有 23 的概率第二次攻击扣减随从的生命值。所以答案为 12×12×2+12×12×1+12×13×1+12×23×0=11121112×415935148(mod998244353)

【提示】

题目顺序可能与难度无关。

【子任务】

在所有测试点中,1T1000,1n1018,1m3,1k8

各个测试点的分值和数据范围如下:

12058

题解

f(i,a,b,c) 表示攻击第 i 次后状态为(a 个 1 血,b 个 2 血,c 个 3 血随从)的期望扣血数。

对于期望问题,显然需要倒序转移。

攻击 Boss 的贡献为:

1a+b+c+1×(f(i+1,a,b,c)+1)

攻击 1 滴血随从的贡献为:

aa+b+c+1×f(i+1,a1,b,c)

攻击 2 滴血和 3 滴血随从类似。

然后合法的 (a,b,c) 状态不会超过 170,可以状态压缩一下,然后由于 f(i,_,_,_)f(i+1,_,_,_) 转移,可以使用矩阵快速幂优化。