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_{i,j}=\sum_{r=0}^{i-1}dp_{r,j-1}\times\left(2^{i-r_0}-1\right)\times\left(2^{r\times(i-r)}\right) \]

初始化 \(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}\)

不难得到转移方程:

\[dp_{i,j}=\left\lfloor\frac n{a_i}\right\rfloor+dp_{i,j-1}-dp_{\left\lfloor\frac n{a_i}\right\rfloor,j} \]

注意到 \(\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。

根据题意有

\[\sum_{j=1}^k\left(i\left(k^2+1\right)+tk+j+\left[i\left(k^2+1\right)+tk+j\right]\leq x\right) \]

化简得

\[(ik+t)(k^2+1)+\frac{n(n+1)}2-t+\max(0,\min(k,i\left(k^2+1\right)+k(t+1)-x+1)) \]

注意到第一个加号的后面一坨 \(\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\) 中生成​

\[k\left\lfloor\frac{n-1}{k^2+1}\right\rfloor+\frac{((n-1)\mod (k^2+1))-[n\geq V]}k \]

个 Special Number ,小于 \(n\) 的 Special Number 有 \(\left\lfloor\frac{n-1}{k^2+1}\right\rfloor+1-[n-V]\) 种,加减计算即可。

posted @ 2024-07-17 07:39  QcpyWcpyQ  阅读(4)  评论(0编辑  收藏  举报