NOIP 模拟赛 7
T1
有个字符串 SSS,你可以删除其的任意子串,询问会得到多少本质不同字符串。
要求线性,字符集小。
考虑容斥,转化成会数重复多少次,注意到每加入一个字符,它并不会影响到前面的点造成的贡献,于是我们只需要统计以 iii 开头的后缀匹配前缀会算重多少,注意到我们只需要统计前面出现过多少次 SiS_iSi 即可。因为我们只需要考虑 iii 什么时后不必须,显然就是有一个位置 ppp,满足 Sp=SiS_p=S_iSp=Si,那么删除 [p,i−1][p,i-1][p,i−1] 和 [p+1,i][p+1,i][p+1,i] 效果等同。
T2
给定一个简单无向图(无自环重边),求 sss 到 ttt 的不连续经过同一条边,经过边数为 kkk 的方案数有多少。
多组询问,询问次数 q≤100q\le100q≤100,点数 n≤200n\le200n≤200,边数 m≤n(n−1)2m\le \frac{n(n-1)}{2}m≤2n(n−1),k≤109k\le10^9k≤109,最开始给定固定的 sss 和 ttt。
首先我们能发现,如果没有不连续经过同一条边的限制就是直接将到达关系转化成邻接矩阵 EEE,然后求 B×EkB\times E^kB×Ek,其中 BBB 为初始矩阵,也就是只有 sss 的位置为 111。
于是容易想到去容斥,容斥的话要知道具体到了哪一个点,于是我们记 f(i,j)f(i,j)f(i,j) 表示走 iii 条边到 jjj 的方案数(满足题目条件)。
然后我们能发现对于 i>2i>2i>2:f(i,u)←(∑v→uf(i−1,v))−(degreeu−1)×f(i−2,u)f(i,u)\gets(\sum_{v\to u} f(i-1,v))-(\text{degree}_u-1)\times f(i-2,u)f(i,u)←(v→u∑f(i−1,v))−(degreeu−1)×f(i−2,u)
也就是说我们减去在 i−2i-2i−2 步后走两步走回到 uuu 的方案,但是 degreei\text{degree}_idegreei 要减去 111 的原因是 i>2i>2i>2 时,你 f(i−1,v)f(i-1,v)f(i−1,v) 不会考虑 v→u→vv\to u\to vv→u→v 的方案。然而 f(i−2,u)f(i-2,u)f(i−2,u) 会考虑 v→uv\to uv→u 的方案,也就是说,你多减去了 v→u→v→uv\to u\to v\to uv→u→v→u 的方案,要加上。
根据上文分析,容易发现 i=2i=2i=2 时不用减掉 111 即可,i=1i=1i=1 不需要容斥。
不难发现这是线性变换,于是你维护一个 (2n)×(2n)(2n)\times(2n)(2n)×(2n) 的矩阵来转移即可。
注意到要多测,你直接暴力是 O(q×n3logk)O(q\times n^3\log k)O(q×n3logk) 的,无法通过,我赛后才了解到有这么一个技巧:我们预处理快速幂需要访问到的矩阵,也就是转移矩阵的 2x2^x2x,然后就转化成为向量乘矩阵,这个东西得到的也是向量,于是可以 O(n2)O(n^2)O(n2) 的乘,总复杂度 O(n3×logk+q×n2logk)O(n^3\times \log k+q\times n^2\log k)O(n3×logk+q×n2logk)。
T3
有 2n2n2n 个人,你要将他们平分成 222 组,然后给出 mmm 个二元组 (ai,bi)(a_i,b_i)(ai,bi),表示若编号为 aia_iai 和 bib_ibi 的人被分到同一组,会对划分的代价增加 2i2^i2i 的贡献。求最小划分代价。
n≤5000n\le5000n≤5000,m≤106m\le10^6m≤106,ai<bia_i<b_iai<bi,(ai,bi)(a_i,b_i)(ai,bi) 互不相同。
考虑没有平分的限制怎么做,这个东西显然可以贪心,用个并查集维护一下连通性即可。
接着考虑需要平分,首先对于一组有关的人(也就是钦定他们划分到相同或者不同的人),他们可以表示成二元组 (pi,qi)(p_i,q_i)(pi,qi),表示有 pip_ipi 个人分在同一组,另外 qiq_iqi 分到另一组,平分的限制就相当于有若干二元组,你需要满足对于每个二元组都选出来一个数,然后让他们的和为 nnn。
这个东西可以用背包检查。但是直接背包是 O(n2m)O(n^2m)O(n2m) 的,有一个显然的优化就是我们只会在 aia_iai 和 bib_ibi 不在一个集合中才会做背包检查,然后如果我们已经检验过不可以就也不会再检查。我们将已经检查过不会合并的两个集合虚拟连边,就可以做到每次都会减少一个集合。于是我们会做 O(n)O(n)O(n) 次背包,于是复杂度变为 O(n3)O(n^3)O(n3),同样的,由于 dp 的是可行性,于是可以 bitset 优化,复杂度变为 O(n3ω)O(\frac{n^3}{\omega})O(ωn3)。
注意到 dp 可行性会浪费异常多的空间和时间,考虑转化成记方案数,但是方案数会特别多,对一个大质数取模即可,我们最多可以取 2182^{18}218 级别的数。
考虑分析错误概率:f≤(1045000)≤2104≤104000f\le \binom{10^4}{5000}\le2^{10^4}\le10^{4000}f≤(5000104)≤2104≤104000,注意如果我们使得素数 p1,p2,…,pnp_1,p_2,\dots,p_np1,p2,…,pn 失效,那么 p1p2p3…pn∣fp_1p_2p_3\dots p_n|fp1p2p3…pn∣f,注意到 (107)600≥104000(10^7)^{600}\ge 10^{4000}(107)600≥104000,于是最多失效 600600600 个素数(事实上远远不到),然而 101810^{18}1018 有大约 1018ln1018≥2×1016\frac{10^{18}}{\ln 10^{18}}\ge2\times10^{16}ln10181018≥2×1016 个素数,失效概率为 60022×1016\frac{600}{2^{2\times10^{16}}}22×1016600,几乎可以忽略。
我们发现转化成
未完待续。