近期总结 2023.10.28
Luogu4156 论战捆竹竿
题意:给出一个长度 \(n\) 的字符串 \(s\),有一个空字符串 \(t\)。每次可以把 \(s\) 接在 \(t\) 后面,相同部分可以重叠。求任意操作后 \(|t|\in[l,r]\) 有多少种可能。
\(1\le n\le 5\times 10^5,\space 1\le l\le r\le 10^{18}\)
不难发现,每次延长的长度都 \(\in \text{period}(s)\),而且,一定存在一张方案满足 \(s\) 的所有周期都能任意次延长。
考虑同于最短路,但是周期数量可能很多,不能很完美地处理。
结论:一个字符串的 \(\text{Border}\) 最多可以划分成 \(O(\log n)\) 个等差数列。
同样的,周期也可以。
考虑一个周期长度的等差数列 \(d,c+d,2c+d,3c+d,...,L\cdot c+d\)
有个 \(d\) 很烦,考虑在 \(\bmod d\) 意义下跑同于最短路,这样每次步长就是 \(c\),直接分环做单调队列即可。
但是不止一个等差数列,这要求我们变模数。考虑先用 \(dis'[i]\) 更新 \(dis[dis'[i]\bmod \text{newmod}]\),然后不断跳 \(\text{oldmod}\) 更新即可。
时间复杂度 \(O(n\log n)\)。
Luogu4707 重返现世
题意:\(n\) 种材料,你需要收集至少 \(k\) 种。每秒随机出现一种材料(可以和之前的重复),每种材料出现概率为 \(\frac m{p_i}\),其中 \(m=\sum\limits_{i=1}^np_i\)。问期望多少秒,模 \(998244353\)。
\(1\le n\le 1000,\space 1\le m\le 10000,\space 1\le k\le n,\space n-k\le 10\)
考虑 \(\text{min-max}\) 容斥。
设 \(t_i\) 表示材料 \(i\) 第一次出现时间。
令 \(g=n-k+1\),那么相当于求 \(t\) 中第 \(g\) 大的期望值。
答案即为
我们相当于算后面那坨东西 \(\sum_{S\in U} (-1)^{|S|-g} {|S|-1 \choose g-1} E(\min_{i\in S} (t_i))\)
注意 \(E(\min_{i\in S} (t_i))\) 相当于第一次出现 \(S\) 中的材料的时间,那么在此之前出现的材料都不是 \(S\) 中的,不难算出其值为 \(\frac m{\sum_{i\in S}p_i}\)。
后面的式子具有良好的递推性质。
设 \(f[i,j,k]=\sum\limits_{S\in \{1,2,...,i\},\sum_{t\in S}p_t=j} (-1)^{|S|-k} {|S|-1 \choose k-1}\)
考虑 \(f[i,j,k]\) 对 \(f[i+1,,]\) 的贡献。
-
不选,\(f[i,j,k] \rightarrow f[i+1,j,k]\)
-
选,\(f[i,j,k]\times(-1) \rightarrow f[i+1,j+p_{i+1},k+1],\space f[i,j,k]\rightarrow f[i+1,j+p_{i+1},k]\)
时间复杂度 \(O(nm)\)。
AGC038E Gachapon
\(n\) 个数 \(1...n\),每次随机生成其中一个数,生成 \(i\) 的概率为 \(\frac m {p_i}\),其中 \(m=\sum p_i\)。当 \(\forall i\in [1,n]\),\(i\) 至少生成了 \(a_i\) 次后,停止生成。求生成的期望次数,模 \(998244353\)。
\(p_i,a_i>1,\space 1\le \sum p_i,\sum a_i,n\le 400\)
设 \(t_i\) 为 \(i\) 生成 \(a_i\) 次时的时间,答案:\(E(\max(t_i))\)。
转化为 \(\sum\limits_S (-1)^{|S|+1}E(\min_{i\in S}(t_i))\)
考虑期望线性性,对于 \(S\),在生成数的过程中,设 \(b_i\) 为 \(i\) 在生成中的出现次数,那么其对应的 \(b\) 集合 \(S_b\) 有许多不同的状态,根据 套路,考虑对于每个状态计算到达他的期望概率以及他停留的期望时间。合法的 \(S_b\) 状态一共 \(\prod\limits_{i\in S}a_i\) 种,但每种概率不同,是个多重集排列数。不难发现每种停留的概率都是 \(\frac m{\sum_{i\in S}p_i}\)。
设 \(f[i,j,k]\) 表示选择了 \(\{1,2,...i\}\) 的一个集合 \(S\),\(\sum_{x\in S}p_x=j\),此时选择集合的 \(S_b\) 之和为 \(k\),方案数系数的总和。
那么
-
不选 \(i+1\),\(f[i,j,k]\rightarrow f[i+1,j,k]\)
-
选 \(i+1\),枚举选了 \(c\) 个,注意算 \(S\) 中出现数的概率是条件概率,分母最后计算,\(f[i,j,k]\times (-1) \times{k+c \choose c}\times p_{i+1}^c\rightarrow f[i+1,j+p_{i+1},k+c]\)
时间复杂度 \(O(n\sum a\sum p)\)。