省选一些互测小结
3-11
string
题意
给你一个 \(01\) 串 \(S\) 有 \(q\) 次询问,每次给一个串 \(T\) 重复很多次后前 \(|S|\) 位后的串 \(T'\) ,你可以把一段区间的 \(01\) 反转,使得 \(S = T\) 求最小操作次数。
\(|S|, \sum |T| \le 2 \times 10^5, \texttt{TL = 2s}\)
题解
首先考虑 \(|S| = |T|\) 的时候的解法,不难发现其实就是它们异或后 \(1\) 的段数。
考场上莫名奇妙想到了可以用算联通块数量来算这个段数(被 PKUWC 毒瘤的回忆),本质上就是为 \(1\) 的点数减去相邻两个都为 \(1\) 的边数。
然后看了看时限似乎还算宽松。那么离线一下,只需要对每种不同长度的询问预处理一下桶就行了。
时间复杂度是 \(\mathcal O(n \sqrt n)\) 的。
sea
题意
题面太长,就不挂了。。
题解
神题一道。。考场上乱写了一个高斯消元骗了骗前面的特殊点。
由于这个 \(\mathrm{DAG}\) 有回城操作,不能直接上全期望公式 \(dp\) 。
有个很神奇的东西,如果我们考虑给根节点定一个期望值 \(v\) ,我们可以直接跑 \(\mathrm{DAG}~dp\) 。
为什么呢?如果在当前期望值下,如果跑的答案能小于之前的答案那么意味着当前的策略能得到更优的答案,显然更优,否则当前的策略一定不能得到更优的答案。
那么我们考虑二分答案 \(ans\) 那么就直接跑个 \(\mathcal O(n^3)\) \(dp\) ,\(f_{i, j}\) 为到 \(i\) 号点还剩 \(j\) 滴血的期望步数,复杂度是 \(\mathcal O(n^3 \log (ans \cdot \epsilon ^{-1}))\) 的。
sword
题意
求
\(k < 5000;~ n, r < 10^{16}\)
题解
记 \(S_k\) 为 \(k\) 阶项的答案。
考试到这里就卡住了,写了 \(k = 1, 2\) 的点。
如何继续推导呢?突然发现我考场上傻吊了,只需要一个简单的交换和式就行了。
边界为 \(\displaystyle S_0 = \sum_{i = 1}^n r^i = \frac{r^{n + 1} - r}{r - 1}\) 。
突然发现我们得到了一个十分简单的 \(\mathcal O(k^2)\) 的递推式。
辛亏出题人良心没有让我们用 \(\mathcal O(k \log^2 k)\) 的分治 \(MTT\) 。。。怕并不 \(\mathcal O(k^2)\) 快多少。。
也许能多项式求逆,不想推啦
3-12
Brain Power
题意
有一个序列 \(1 \sim n\) ,\(n\) 一开始选上。然后从 \(1 \sim n\) 中随机选择 \(m\) 个数(不重复),问相邻两个间隙的 \(\gcd\) 为 \(1\) 的方案数,对于 \(453682211\) 取模。
\(2 \le m \le n \le 5 \times 10^9\)
题解
考虑容斥,我们有一个经典公式 \(\sum_{x | d} \mu(x) = [d = 1]\) 。
然后贡献其实就是
我们用杜教筛预处理 \(\mu\) 的前缀和,对于组合数类似抛硬币那样预处理阶乘,然后扩展卢卡斯就行了。
由于这个扩展卢卡斯太难写了
(不记得了),考试直接放弃 TAT
复杂度是 \(\mathcal O(n^{2 / 3} + (\sqrt n + p) \log p)\) 的??
Floor of Lava
题意
给你一个 \(n\) 个点 \(m\) 条边的仙人掌,每条边有 \(\displaystyle \frac 1 k\) 的概率消失。问最后点数 \(>1\) 的联通块的期望个数。答案对于 \(4536882211\) 取模。
\(n \le 10^6\)
题解
又是联通块计数 TAT。。。怎么不早点出啊。。。
直接用点数 \(-\) 边数 \(+\) 环数 \(-\) 单独一个点的个数就行了。
用 \(Tarjan\) 求环,然后预处理幂和幂的逆元就能做到 \(\mathcal O(n)\) 了。
V
题意
有一个长为 \(n\) 的序列 \(\{k_i\}\) ,有 \(m\) 次操作,第 \(s\) 次把 \(k_i\) 变成 \(\displaystyle \frac {a_s}{k_i + b_s}\) ,输出每次变换后 \(k\) 的和,对于 \(998244353\) 取模。
\(n \le 10^5, m \le 3 \times 10^4\)
题解
多项式神仙。。写了一个离线逆元的拿了 \(40pts\) 完全不会了。。
恕我多项式水平实在太低,看不懂题解,只能 \(orz\) Great_Influence 了。
如果给了板子还不会写的话,那我也没什么办法了。
3-14
题面差评,派节金拱门三元一个派好评。
吹瓶子
题意
问有多少个长为 \(n\) 的序列 \(A_i\) ,满足前缀或和单调不降且 \(\forall i, A_i < 2^k\) ,答案对于 \(10^9 + 7\) 取模。
\(n, k \le 5 \times 10^4\)
题解
考试时候搞了个 \(\text{MTT}\) 跑 \(\mathcal O(nk\log k)\) ,\(n, k = 2000\) 要跑 \(4s\) 。。。
后来听到卡常可以过 \(2000\) ,就也写了个,发现有 \(75pts\) 好评。
那时候觉得应该是倍增合并信息or生成函数之类的,但时间不够没有细想了。
其实是考过的毛爷爷的论文题。
设 \(f(i, j)\) 为前 \(i\) 位填了 \(j\) 个 \(1\) 的方案数,那么逐个转移是很显然的:
答案其实就是 \(\displaystyle \sum_{i = n}^{k} f(n, i) {k \choose i}\) 。
显然每次填一个不是很优秀,每次我们考虑填连续一段有如下转移:
然后考虑倍增解决这个式子就能做到 \(\mathcal O(nk \log n)\) 了。
配合上 \(\text{MTT}\) 就能做到 \(\mathcal O(n \log n \log k)\) 了,要配合一些奇奇怪怪的优化,例如共轭、预处理单位复数根之类的操作才能过。
注意边界时,\(f(0, i) = [i > 0]\) ,好像意义不好理解,可以利用生成函数表达。
写论文
题意
定义 \(f(x)\) 为
给定 \(n, K\) 求 \(f(n) \pmod {10^9 + 7}\) 。
\(T \le 1000, 2 \le K \le 10, 1 \le n \le 10^{36}\)
题解
神题。。一开始只找出任意阶差分无限同构。
其实 \(f(n)\) 就是把 \(n\) 表示成若干个 \(K\) 的幂次的和的方案数,这个可以由之前的递推转移看出来。(出题人为了不让观察出来,特意把 \(f(x - 1)\) 写成 \(f(x - K)\) 。。。毒瘤)
这样其实就是个完全背包问题,利用最小表示法考虑按位 \(dp\) 。
首先设 \(f(i, j, k)\) 为当前凑出 \(j \times K^i\) 体积背包的最大物品体积为 \(K^k\) 的方案数,那么转移其实就是:
对于 \(i = 0\) 显然有 \(f(0, j, 0) = 1\) 。
下面都是 \(i > 0\) :
其中第三个转移右半部分是强制选的体积不小于 \(K^l\) 的方案,至于为什么可以恰好划分,可以问 Hany01 。
然后求 \(f(n)\) 那么类似前面 \(dp\) 设 \(g(i, j)\) 为当前填完 \(n\) 的第 \(i\) 位,物品最大体积为 \(2^j\) 方案数。
令 \(x\) 为 \(n\) 在 \(K\) 进制上第 \(i\) 位的值,那么转移就很显然啦:
这样如果预处理 \(f\) 可以做到 \(\mathcal O(K^2 \log^3 n + T \log^3 n)\) 。
玩游戏
题意
你有一个 \(n × m\) 的方格图, \((x, y)\) 上有一个击杀后价值为 \(v(x, y)\) 的野怪。你可以选择任意一个点作为起点,开始时刻为第 \(0\) 秒。每次你可以花费一秒到达一个离你距离为 \(1\) 的位置,若第 \(i\) 秒开始时你在 \((x, y)\) 上的话就可以击杀这个位置上的野怪获得 \(v(x, y)\) 的金钱,野怪在偶数秒时可以获得侦查能力,所以偶数秒时离你距离为 \(1\) 的野怪都会逃跑。
因为何石想要早点做出无尽之刃,所以他想要最大化他打野的经济。
\(n, m \le 100, T \le 50\)
题解
因为相邻的格子是不能同时取到的,对于不相邻的格子一定可以同时取到,那么很容易就会想到二分图染色后求出这个图的最大权独立集。
直接建图跑最小割就行了,用总权值减去割的大小就行了,复杂度 \(\mathcal O(T\text{ maxflow}(nm,nm))\) ,用 \(\mathcal Dinic\) 跑特殊图好像效果不错。
3-15
题目似乎有点难了。。作为验题人真是抱歉啊。
A
题意
给你一个 \(n\) 个点的树,\(m\) 条信息(路径),定义两个信息有边当且仅当一条信息(路径)包含另外一条,以及一开始会给你 \(q\) 条基础信息之间的边。
求对于这些信息的任意一个拓扑序。
\(n, m, q \le 10^5\)
题解
似乎有神仙的主席树合并优化建边的做法qwq。
有一种神奇的方法也可以得到拓扑序,也就是考虑反图上 \(\text{dfs}\) 序的后序遍历,其实是一样的。
那么就能得到一个很显然的做法,我们每次到一个信息,找到随意一个连出去的边,然后遍历,直到不能遍历为止。
这个过程是求个二维偏序的过程,可以利用线段树 + std :: set
实现。
但这样复杂度还是错的,如何保证复杂度呢?我们每次到一个点把它在线段树中的信息删除就行了,这就显然是正确的了。
复杂度也就是 \(\mathcal O(m \log^2 n)\) 的。
B
题意
定义邻接矩阵上的乘法是矩阵乘法的加法变成或,乘法变成与。
给定一个 \(n\) 点 \(m\) 条边的有向图,问它邻接矩阵的最小正周期,对于 \(n \le 200\) 的点询问它的什么时候进入最小正周期。
对于所有数据有 \(n, m \le 2 \times 10^5\) 。
题解
找找规律,不难发现其实就是对于每个强连通分量的所有环的 \(\gcd\) 求个 \(\mathrm{lcm}\) 。
然后这个用 \(\mathrm{Tarjan}\) 求一下就好啦,然后对于每个质因子分别考虑就行了,这部分复杂度是 \(\mathcal O(n + m)\) 的。
然后问什么时候进入最小正周期,二分一下时刻,判断一下 \(A^x = A^{x + d}\) 就行了。
然后倍增以及 std :: bitset
实现就能做到,\(\mathcal O(\displaystyle \frac{n^3}\omega \log d)\) 。
C
题意
投掷 \(n\) 次有 \(K\) 面的骰子,求前 \(L\) 个数字出现次数的 \(F\) 次方的期望,即:
对于所有数据,有 \(1 \le n, K \le 10^9; 1 \le F \le 1000; 1 \le L \le K; 1 \le LF \le 50000\) 。
题解
做法竟然是大力一波拆式子.。。
设 \(x_{i,j}\) 表示第 \(j\) 次是否投到 \(i\) ,那么答案就是 \(\mathbb E[\prod_{i = 1}^L (\sum_{j = 1}^n x_{i, j})^F]\) 。利用期望的线性性,我们可以把这个乘积式拆开分别考虑每一项的期望。
若某一项中存在 \(x_{a,c}\) 和 \(x_{b,c}\) ( \(a \not = b\) ), 且它们的次数不为 \(0\) 那么这一项的期望就为 \(0\) ;否则它们是完全相互独立的,且只与变量个数有关,与次数无关(因为 \(x \in \{0, 1\}\) 所以 \(x^i = x\) )。 设 \(p\) 表示独立变量的个数,那么这一项的期望就为 \(\displaystyle \frac 1 {K^p}\) 接下来我们就只需要考虑计算有 \(p\) 个独立变量的项的系数。
比如对于 \(n = K = L = F = 2\) 的数据,就对应着
这些变量的选法。显然选法是有很多的,但是对于每个选法的选取的变量长度是不会长过 \(KL\) 的,那么我们接下来就需要忽略选取是 \(n\) 个里面哪一个,只考虑选了几个。
设 \(w_{x,y}\) 表示 \((\sum_{j=1}^n x_{i,j})^x\) 展开之后有 \(y\) 个独立变量的系数和,枚举新加入的变量。
可以得到递推式
本质其实就是斯特林数,利用组合意义也很好理解,其实我们就是要求长为 \(F\) 的序列选取了 \(y\) 个不同的变量的方案数。(此处显然忽略了顺序,且 \(y\) 个都至少选上一个)
那么我们考虑令 \(f_{a, b}\) 为\(\prod_{i = 1}^{a}(\sum_{j=1}^n x_{i,j})^x\) 展开之后有 \(y\) 个独立变量的系数和,那么有:
那么答案其实就是
然后发现对于 \(i \ge \bmod\) 的项显然都是 \(0\) 可以长度取个 \(\min\) 。
然后前面那个式子本质就是不断乘上 \(\sum_{i = 0}^b w_{F, i} x^i\) 这个多项式,我们直接快速幂就行了,\(\text{FFT}?\) 不如暴力。
那么复杂度就是 \(\mathcal O(F^2 + m^2 \log L)\) 的。