7.16 模拟赛
A. 线段
若已知 \(k\) 则是一个非常经典的贪心。
考虑 dp。
\(dp_{i,j}\) 表示当前扩展右端点为 \(i\) 且已选 \(j\) 个区间方案数。
考虑转移如何转移到当前状态,枚举第 \(j-1\) 个区间的右端点 \(r_0\)。
其中对于线段 \([l,r]\):
-
满足 \(r_0<l\leq r=i\) 的线段有 \(i-r_0\) 条,因为至少有一条线段存在,故贡献为 \(2^{i-r_0}-1\);
-
\(r_0<l<r<i\) 的线段不存在。
-
满足 \(r_0<l\leq i<r\) 的线段有 \(r\times(i-r)\) 条,因为其存在对答案无影响,故贡献为 \(2^{r\times(i-r)}\)。
那么有状态转移方程
初始化 \(dp_{0,0}=1\)。
最后统计所有 \(dp_{i,k}\) 对答案的贡献。因为共有 \(i\times(n-i)\) 个线段,所以贡献为 \(2^{i\times(n-i)}\)。
因此 \(ans=\sum_{i}dp_{i,k}\times2^{i\times(n-i)}\)。
时间复杂度为 \(\mathcal O(n^3)\)。
B. 计算
- 考场 80 分做法:
考虑暴力容斥,枚举一个子集 \(S\),其贡献为 \((-1)^{\lvert S\rvert}\frac{n}{\prod a_i\in S}\)。
不难想到莫比乌斯函数的定义,其本质就是对 \(\mathbb N\) 做容斥原理可以得到贡献系数 \(\mu\)。
直接对 \(a\) 求 \(\mu\) 即可。线性筛时间复杂度为 \(\mathcal O(n)\)。
- 正解:
考虑 dp。设 \(dp_{i,j}\) 表示 \([1,i]\) 至少被 \(j\) 个 \(a\) 整除的数量,那么答案为 \(n-dp_{n,m}\)。
不难得到转移方程:
注意到 \(\left\lfloor\frac nx\right\rfloor\) 的取值只有 \(\mathcal O(\sqrt n)\) 个,所以有效的状态只有 \(\mathcal O(\sqrt nk)\) 个。
类似于滚动数组用 map 存。但此时空间复杂度难以接受。考虑设置阈值 \(B\),当 \(i\leq B\) 时正常记搜,\(i>B\) 时用 map,可以接受。
C. 球
将 \
看做 0,/
看做 1。
考虑线段树维护。
- len 维护区间长度。
- mx01,mx10 维护区间最长的 01 段和 10 段。
- l/r 0/1 维护区间 左/右 端极长 0/1 串。
- l/r 01/10 维护区间 左/右 端极长 01/10 串。
- tag 维护区间是否翻转。
D. 数列
先考虑将生成的数列 \(s\) 分成两类:作为 \(k\) 个之一加入的数,和被加进来的数。不妨称后者为 Special Number。
把构造 \(s\) 时每次取 \(k\) 个及其和并加入的操作称为“一轮”。
Corollary
\(\forall i\geq 0,\left[i\left(k^2+1\right)+1,\left(i+1\right)\left(k^2+1\right)\right]\) 区间中有且仅有一个 Special Number
- 考虑归纳证明:
对于 \(i=0\) 有且仅有一个 Special Number \(\frac {k(k+1)}2\)。
考虑如何由第 \(i\) 段的 Special Number 推导第 \(ki\sim k(i+1)-1\) 段的 Special Number。
根据题意有
化简得
注意到第一个加号的后面一坨 \(\in\left[1,k^2+1\right]\),所以这个数一定在第 \(ik+t+1\) 段中。
有了这个 Corollary 后,题目好做了。
考虑一次询问 \(n\) 和 \(k\),先算出 \(n\) 在第 \(\left\lfloor\frac{n-1}{k^2+1}\right\rfloor\) 段中。用倍增求出这个段中的 Special Number 是 \(V\),若 \(n=V\) 可以直接求出。它在第 \(\left(\left\lfloor\frac{n-1}{k^2+1}\right\rfloor+1\right)\left(k+1\right)\) 项上。
若 \(n\neq V\) 则考虑求出 \(n\) 前面出现了多少大于它的 Special Number。由 \(n\) 前面的数一共能在 \(s\) 中生成
个 Special Number ,小于 \(n\) 的 Special Number 有 \(\left\lfloor\frac{n-1}{k^2+1}\right\rfloor+1-[n-V]\) 种,加减计算即可。