省选数学专题 3 做题记录

省选数学专题 3 做题记录

A Gym102978A Ascending Matrix

\(\text{Link}\)

我们先不考虑 \(a_{r,c}=v\) 这个限制,考虑怎么做。由于要求矩阵行、列均递增,所以可以发现的是 \(\forall i\)\(a_{x,y}\le i\) 的部分应该构成一个在左上角的连通块。我们考虑以此分段,对于每一个 \(i\),求出 \(\le i\)\(>i\) 部分的交界线。注意这里我们是在边上来画分割线的。

这样的话会发现,此时我们形成了 \(k-1\) 条路径(最后一条一定只有一种情况所以不考虑),这些路径会有重合的部分,但是没有交错。考虑一个经典的技巧是我们把第 \(i\) 条路径向右向下平移 \(i-1\) 个单位长度,这样的话所有路径之间都没有交点了。此时路径的起终点就是 \((n,0),(0,n)\) 这两个交点平移后的位置,那么现在我们只需要求出从起点走到终点的路径组个数即可。

求解无交路径组个数显然考虑 LGV 引理,用组合数简单计算出方案数然后直接求行列式即可。由于这是网格图所以求出的答案直接就是路径组个数。

然后考虑如何做 \(a_{r,c}=v\),我们找到 \((r,c)\) 平移 \(v-1\) 后对应格子左上方的交点 \(P=(r+v-2,c+v-2)\),首先不难看出不能有任何路径经过这个点,否则的话一定不符合条件。其次在这个点左上方的所有路径总数应该恰为 \(v-1\),原因也是显然的。考虑如何满足这个条件,我们使用一个变元的技巧,即把这两种路径的贡献分开。对于在左上角的路径,我们把其权值设为 \(x\),剩下的权值设成 \(1\)。那么对于一个路径组,我们求出乘积后,对应项应该正好是 \(x^{v-1}\)。所以我们求出这一项前的系数即可。

直接强行高消做不了,因为多项式上界是 \(k-1\) 次的。我们可以考虑使用拉格朗日插值,把 \(1\sim k\) 这些点值代入求出行列式值,最后还原出多项式系数即可。这样的话我们就在 \(O(k^4)\) 的复杂度内解决了这个问题。

B Gym103415J Cafeteria

\(\text{Link}\)

首先朴素的 dp 方程是非常容易得出的,设 \(dp(i,j)\) 表示文本串遍历到 \(i\),模式串匹配到 \(j\) 的方案数,转移为:

\[dp(i,j)=[s_i=t_j]dp(i-1,j-1)+dp(i-1,j) \]

直接做是 \(O(Tnm)\),非常爆炸。考虑优化,由于第二维 \(m\) 较小,所以可以考虑从这里入手。我们考虑矩阵优化,对于每一个位置 \(i\) 计算出一个转移矩阵 \(M_i\),然后我们要求的实际上就是一段区间矩阵的连乘。这个可以通过维护矩阵前缀积以及矩阵逆的前缀积来做到。这样的话我们的复杂度应该可以降到 \(O(nm^3+Tm)\)

事实上我们还可以进一步优化。观察到原矩阵是非常有特色的,它应该形如下面的矩阵:

\[\begin{bmatrix} \ddots & \vdots & \vdots & \vdots \\ \dots & 1 & 1 & 0 \\ \dots & 0 & 1 & 1 \\ \dots & 0 & 0 & 1 \\ \end{bmatrix} \]

而他的逆矩阵应该形如下:

\[\begin{bmatrix} \ddots & \vdots & \vdots & \vdots \\ \dots & 1 & -1 & 1 \\ \dots & 0 & 1 & -1 \\ \dots & 0 & 0 & 1 \\ \end{bmatrix} \]

这两个矩阵做乘法都可以做到 \(O(m^2)\) 的复杂度。具体的,对于第一个,我们每一列上最多只有两个位置有值;对于第二个,观察到有每一行要么除了主元外全部是 \(0\),要么除了主元外运算结果和下一行完全是相反数,所以对于新矩阵的第 \(i\) 行,要么和原矩阵完全一致,要么是用原矩阵的第 \(i\) 行减去新矩阵的第 \(i+1\) 行得到,这样递推下来复杂度就是 \(O(m^2)\) 的了。

如此我们的复杂度是 \(O(nm^2+Tm)\) 的,可以通过了。注意存储的时候不要全部存下来,只存储对答案有用的信息,空间复杂度应该是 \(O(nm)\) 的。

C Gym103415K Magus Night

\(\text{Link}\)

传统容斥的集大成者。首先第一步先做一次容斥,我们把答案拆成总方案数减去不合法方案数。总方案数就是:

\[\sum_{s_i\in [1,m]} \prod_{i=1}^n s_i=\prod_{i=1}^n\sum_{s_i=1}^m s_i=\left(\dfrac{m(m+1)}2\right)^n \]

注意这里的和积式交换的方法非常重要,下面还会多次用到。然后不合法的方案分为两部分:\(\gcd>q\) 的和 \(\gcd\le q\)\(\text{lcm}< p\) 的。下面我们分类解决两个部分:

  • \(\gcd>q\) 的部分:

    先枚举 \(\gcd\),然后令 \(f(d)\) 表示 \(\gcd=d\) 的方案之和,我们累加 \(f(d)\) 就是答案。而 \(f(d)\) 的求法应该是比较经典的了,这里直接给出答案:

    \[f(d)=\sum_{e=1}^{\lfloor\frac{m}{d}\rfloor}\mu(e)\left(ed\times \dfrac{1}{2}\times\left\lfloor\frac{m}{de}\right\rfloor\times\left(\left\lfloor\frac{m}{de}\right\rfloor+1\right)\right)^n \]

    复杂度是 \(O(m\log m\log n)\) 的。

  • \(\gcd\le q\)\(\text{lcm}<p\) 的部分:

    依然先枚举 \(\gcd\),由于 \(\gcd\mid \text{lcm}\),所以可以再枚举一下 \(\text{lcm}\),复杂度是 \(O(m\log m)\) 的。现在相当于我们要求:

    \[\sum_S[\gcd(S)=d_1\land \text{lcm}(S)=d_2]\prod_{s_i\in S} s_i \]

    这个还是一个经典的式子,我们分为三个部分:

    \[\begin{aligned} &f(d)=\sum_S[\gcd(S)=1\land \text{lcm}(S)=d]\prod_{s_i\in S} s_i\\ &g(d)=\sum_S[\gcd(S)\mid d\land \text{lcm}(S)=d]\prod_{s_i\in S} s_i\\ &h(d)=\sum_S[\gcd(S)\mid d\land \text{lcm}(S)\mid d]\prod_{s_i\in S} s_i\\ \end{aligned} \]

    最后答案是 \(f(\frac{d_2}{d_1})\times {d_1}^n\),而这三个式子从下往上都可以直接莫反求出答案,最后一个式子用上面的和积式技巧也是容易做出的,所以这里依然给出最后答案:

    \[\begin{aligned} &h(d)=\sigma_1(d)^n\\ &g(d)=\sum_{e\mid d} \mu(\frac{d}{e})h(e)\\ &f(d)=d^n\times \sum_{e\mid d} \mu(\frac{d}{e})\frac{g(e)}{e^n} \end{aligned} \]

    这个的求解依然是 \(O(m\log m\log n)\) 的。

如此我们就可以在 \(O(m\log m\log n)\) 的复杂度内完成上述容斥,可以通过本题。

D AGC034F RNG and XOR

\(\text{Link}\)

首先这道题我们有一个最基本的转移方程,设 \(f(i)\) 表示操作出 \(i\) 的期望步数,则有:

\[\begin{cases} f(0)=0\\ f(i)=\sum f(j)\times p_{i\oplus j}+1 \end{cases} \]

下面这个转移的形式比较像位运算卷积,我们给它改写成一般形式:

\[f(i)=\sum_{j\oplus k=i} f(j)\times p_k+1 \]

考虑将转移写成集合幂级数的形式,令 \(f,p\) 的集合幂级数分别为 \(F,P\),则有:

\[F=F* P+I \]

注意这里的 \(*\) 指的是异或卷积,\(I\) 为单位幂级数。这个式子看上去非常正确,但是实则不然,观察后可以发现,由于 \(P\) 的系数之和为 \(1\),所以等式右边比左边多出来了一个 \(I\)\(2^n\) 的系数和。因此我们要在左边加上一个常数项 \(2^n\),所以有:

\[F+2^n=F*P+I \]

移项后可得 \(F*(1-P)=I-2^n\),直接做一次 FWT 即可得到:

\[\begin{aligned} &\text{FWT}(F)_i\times\text{FWT}(1-P)_i=\text{FWT}(I-2^n)_i\\ \Rightarrow&\text{FWT}(F)_i=\dfrac{\text{FWT}(I-2^n)_i}{\text{FWT}(1-P)_i} \end{aligned} \]

那么我们对 \(1-P\)\(I-2^n\) 分别做 FWT,将点值相除得到 \(\text{FWT}(F)\),然后再做一次 IFWT 即可得到正确的 \(F\)

最后还有一个小问题,我们最后求出的 \(F\) 还是可能不满足 \(f(0)=0\),不过容易发现,我们将所有 \(f\) 同时减去一个值不会影响结果,所以我们输出 \(f(i)-f(0)\) 就是答案。复杂度是 \(O(n2^n)\)

E AGC038E Gachapon

\(\text{Link}\)

首先我们假设最后每个数第一次达到 \(B_i\) 的时间是 \(t_i\),那么我们要求的就是 \(E(\max t_i)\)。看到这个就不难想到 Min-Max 容斥,我们有:

\[E(\max t_i)=\sum_{T\subseteq \{1,2,\cdots,n\}}(-1)^{|T|-1}E(\min(T)) \]

现在考虑如何求 \(E(\min(T))\)。首先第一步,我们发现所有在 \(T\) 之外的元素对 \(T\) 的求解应该没有太多影响,所以我们希望把这一部分的贡献刨掉。我们知道,对于一个概率为 \(P\) 的事件,完成他的期望步数是 \(\dfrac{1}{P}\)。所以假如我们只考虑 \(T\) 之内每个元素的概率,算出 \(E\) 之后乘上一个 \(\dfrac{1}{P}\) 应该就是正确答案。\(P\) 也是好算的,令 \(A=\sum a_i\)\(P\) 就是 \(\dfrac{\sum_{i\in T} a_i}{A}\)

然后考虑怎么计算 \(T\) 之内的期望。这里需要一步经典的转化。我们把期望写成定义的形式,然后变形可得:

\[\begin{aligned} &E(\min(T))=\sum i\times P(\min(T)=i)\\ \Rightarrow &E(\min(T))=\sum P(\min(T)\ge i) \end{aligned} \]

也就是我们要对每个 \(i\),求出在第 \(i\) 轮还没有任何元素达到 \(B_i\) 的概率之和。我们枚举每个元素被选取的个数 \(c_i\),令 \(k=\sum c_i\),则我们的概率就是多重组合数乘上概率,为:

\[\frac{k!}{\prod c_i!}\times \prod\left(\frac{a_i}{\sum\limits_{j\in T} a_j}\right)^{c_i} \]

所以整理得答案是:

\[\sum_{T\subseteq\{1,2,\cdots,n\}}(-1)^{|T|-1}\times A\sum\frac{k!}{(\sum\limits_{i\in T} a_i)^{k+1}}\prod \dfrac{a_i^{c_i}}{c_i!} \]

这个时候我们就可以直接 dp 了,令 \(dp(i,j,k)\) 表示考虑前 \(i\) 个数,\(\sum a_i=j\)\(\sum c_i=k\) 的方案数。转移的时候带上容斥系数,我们有:

\[dp(i,j,k)=dp(i-1,j,k)-\sum dp(i-1,j-a_i,k-l)\times \frac{a_i^{l}}{l!} \]

要注意初值有转移系数,应该是 \(dp(0,0,0)=-1\)。最后答案就是 \(A\times \sum \dfrac{dp(n,i,j)\times j!}{i^{j+1}}\)。直接转移的话复杂度好像是 \(O(n^4)\) 的,但是实则不然,因为我们 \(l\) 的枚举上界不超过 \(B_i\),所以这个枚举量上界不超过 \(\sum B=400\)。所以复杂度应该是 \(O(n^3)\) 级别的,可以通过。

F CF623E Transforming Sequence

\(\text{Link}\)

首先我们会有一个显然的 dp,设 \(dp(i,j)\) 表示当前枚举到 \(i\)\(b_i\) 中有 \(j\) 位为 \(1\) 的方案数。转移枚举 \(b_i\) 新增了多少位,用组合数计算方案数即可,有:

\[dp(i,j)=\sum_{p=0}^{j-1} dp(i-1,p)\times\binom{k-p}{j-p}\times 2^p \]

发现这个式子很像可以卷积的样子,把组合数拆开可以得到:

\[\begin{aligned} &dp(i,j)=\sum_{p=0}^{j-1} dp(i-1,p)\times \dfrac{(k-p)!}{(j-p)!(k-j)!}\times 2^p\\ \Rightarrow&dp(i,j)\times (k-j)!=\sum_{p=0}^{j-1} dp(i-1,p)\times (k-p)!\times2^p\times \dfrac{1}{(j-p)!} \end{aligned} \]

我们令 \(f(i,j)=dp(i,j)\times (k-j)!\),则可以得到:

\[f(i,j)=\sum_{p=0}^{j-1}f(i-1,p)\times 2^p \times\frac{1}{(j-p)!} \]

这就是一个比较朴素的卷积形式了,初值为 \(f(0,0)=k!\)。直接转移的话可以得到一个 \(O(nk\log k)\) 的做法,显然过不去。我们考虑利用倍增 FFT 来优化它。上面我们已经写出了 \(i,i-1\) 之间的关系,我们还需要的是一个 \(2i,i\) 之间的关系式。

我们将长为 \(2i\) 的序列分成两个部分,先枚举前半部分 \(1\) 的个数 \(p\),然后后半部分要贡献 \(j-p\)\(1\)。那么实际上对于后半部分,我们只是将上面转移中的初值设为了 \(f(0,0)=f(i,p)\),并且转移的时候会多出一个 \(2^{p}\),其余的没有什么变化。而由于转移式中全部是乘法,所以这两个贡献都是可以提出来的,于是有:

\[f(2i,j)=\sum_{p=1}^{j-1} \frac{f(i,p)}{k!}\times (2^p)^i\times f(i,j-p) \]

转化一下可以得到:

\[f(2i,j)=\dfrac{1}{k!}\sum_{p=1}^{j-1}f(i,p)\times (2^i)^p\times f(i,j-p) \]

这就是一个标准卷积式了。那么我们就可以直接用倍增 FFT 优化转移了,复杂度是 \(O(k\log k\log n)\),可以通过。注意本题的模数是 \(10^9+7\),不是 NTT 模数,因此需要使用 MTT 实现。

G AGC021F Trinity

\(\text{Link}\)

我们发现列上的限制比较多,所以我们考虑以列为状态进行 dp。设 \(dp_{i,j}\) 表示前 \(i\) 列已经确定了 \(j\) 行上 \(A\) 的值的方案数,注意这里的方案数是不考虑具体的行号的,所以最后答案应该是 \(\sum\dbinom{n}{i}dp_{m,i}\)

然后考虑转移,这里需要分类讨论一下第 \(i\) 列上有没有新确定的行:

  • \(i\) 列上有新确定的行:

    考虑枚举新确定的行的行数 \(k\),那么说明上一列应该已经确定了 \(j-k\) 行的值,也就是 \(dp_{i-1,j-k}\)。然后考虑这一列上选格子的方案数,我们需要考虑最上面和最下面的格子是不是前面已经确定的行中选的。所以再讨论一下:

    • 最上面和最下面的格子都是新确定的:

      这个方案数很简单,就是 \(\dbinom{j}{k}\)

    • 最上面和最下面的格子有一个是新确定的:

      这意味着这一列上我们实际选了 \(k+1\) 个格子,而上下两个格子中有一个是新添加的,所以方案数是 \(2\dbinom{j}{k+1}\)

    • 最上面和最下面的格子都不是新确定的:

      这意味着这一列上我们实际选了 \(k+2\) 个格子,上下格子都不是新添加的,所以方案数直接就是 \(\dbinom{j}{k+2}\)

    所以这一部分的方案数就是 \(\dbinom{j}{k}+2\dbinom{j}{k+1}+\dbinom{j}{k+2}\),化简一下就是 \(\dbinom{j+2}{k+2}\)

  • \(i\) 列上没有新确定的行:

    这个就比较简单了,仿照上面的方法讨论一下即可,方案数应该是 \(1+j+\dbinom{j}{2}\)

所以可以得到转移方程:

\[dp_{i,j}=\sum_{k=1}^{j}dp_{i-1,j-k}\times\binom{j+2}{k+2}+dp_{i-1,j}\times\left(1+j+\binom{j}{2}\right) \]

最后面那一项不用管,看前面怎么优化。把组合数直接拆开可得:

\[\begin{aligned} &\sum_{k=1}^jdp_{i-1,j-k}\times\binom{j+2}{k+2}\\ =&\sum_{k=1}^jdp_{i-1,j-k}\times\frac{(j+2)!}{(k+2)!(j-k)!}\\ =&(j+2)!\times\sum_{k=1}^j \frac{dp_{i-1,j-k}}{(j-k)!}\times(k+2)! \end{aligned} \]

后面这个显然是卷积式,直接 NTT 优化即可。复杂度是 \(O(mn\log n)\) 的,可以通过。

H AGC020F Arcs on a Circle

\(\text{Link}\)

首先第一步我们考虑断环为链,我们把最长的一条弧任意放在圆上,然后不可能再有弧跨过这条弧,所以我们就可以变成一条链了。

然后现在的难点在于我们的坐标有可能是小数,比较难处理。我们考虑这样一个思路:题目中的 \(C\) 比较小,所以我们可以尝试将它再次细分,然后每条线段依然只能放在整点上。我们令将这个环分成了 \(m\) 份后合法的方案数为 \(f(m)\),先考虑如何求 \(f(m)\)

显然由于 \(n\) 较小,所以可以状压 dp。设 \(dp_{i,S,j}\) 表示当前枚举了起点在 \(i\) 及以前的线段,当前已用线段集合为 \(S\),覆盖到的最右端点为 \(j\)。转移时保证 \(i\le j\),每次从小到大枚举一下当前要填的线段,转移是比较容易的。这一部分的复杂度是 \(O(m^2n2^n)\)

不过现在的问题是 \(m\) 取多少,实际上 \(m\) 取到多少都不能在合理的时间复杂度内得到正确的答案,所以我们要换一个角度考虑。我们发现,当 \(m\to +\infty\) 时,\(f(m)\) 就是正确的方案数,而我们要求的是概率,于是答案就是:

\[\lim_{m\to +\infty} \frac{f(m)}{m^{n-1}} \]

此时我们观察可以发现,\(f(m)\) 本身就是一个关于 \(m\)\(n-1\) 次多项式,原因在于我们每增加一条线段就会使得次数至多加一。那么上面这个式子的值实际上就是 \(f(m)\)\(n-1\) 次项的系数。求这个就是比较简单的了,直接代入 \(n\) 个点值然后拉格朗日插值求出最后答案即可。最后复杂度是 \(O(\sum(ic)^2\times n2^n)=O(c^2n^42^n)\)

I P8340 [AHOI2022] 山河重整

\(\text{Link}\)

首先这道题有一个比较显然的 \(O(n^2)\) dp,但是遗憾的是这个做法并没有什么前途,我们需要更换思路。

考虑容斥,我们用总方案数减去不合法的方案数,总方案数自然是 \(2^n\),考虑不合法方案数。我们知道不合法方案中一定存在一个 \(i\) 使得 \(1\sim i\) 都可以被表示但是 \(i+1\) 无法被表示,我们枚举这个 \(i\) 就可以算出不合法的方案数了。现在考虑求对于一个 \(i\) 的答案。

\(f_i\) 表示在 \([1,i]\) 中任意选出若干个数,使得它们可以表示出 \(1\sim i\) 中所有数但是无法表示 \(i+1\) 的方案数。根据定义我们知道,合法方案中选出的数字和一定是 \(i\),否则无法同时满足两个条件。然后根据这个再做一次容斥,令 \(g_i\) 表示从 \([1,i]\) 中选出若干个不同的数表示出 \(i\) 的方案数,则 \(f_i=g_i-\sum f_j\times val(j,i)\),其中 \(val(j,i)\) 表示从 \([j+2,i]\) 中选出若干个不同的数表示出 \(i-j\) 的方案数。

先看 \(g_i\) 怎么求,求互异拆分数是一个经典的 dp,因为要求互异所以选出的数个数的上界只有 \(\sqrt n\),理论复杂度是 \(O(n\sqrt n)\) 的。要做到这个复杂度也是容易的,我们把每个数展开写成如下形式:

1-*
2-**
4-****
5-*****

我们此时按照列进行 dp,容易发现,列长度上限就是 \(\sqrt n\),所以直接背包复杂度就是正确的。注意枚举到某一个长度时我们要强制选一个这个长度,因为如果存在 \(i\) 必然存在 \(i-1\),否则会有重复数字。

然后考虑后面那一坨 \(\sum f_j\times val(j,i)\) 如何求,令其为 \(h_i\)。我们发现如果我们将值域整体减去 \((j+1)\),那么就变成了 \([1,i-j-1]\),而如果此时选了 \(p\) 个数,我们的对应值就变成了 \(i-j-(j+1)p\)

也就是说如果我们在这个区间中选出的数字之和是 \(\sum\),那么有 \(i-j-(j+1)p=\sum\),也就是 \(\sum+j+(j+1)p=i\)。而注意到 \(p\) 就是第一列的长度,所以当我们枚举到的列长度为 \(i\) 时,我们要给 \(h_{j+(j+1)i+i}\) 赋初值为 \(f_j\),这样就可以完成转移。

然后会发现再转移的时候我们要先求出前面的 \(f\),似乎复杂度不正确。不过发现合法的 \(j\) 一定满足 \(j\le \dfrac{i}{2}\),所以我们可以分治求解这个 dp,每次先求出前一半的 dp 值再转移,复杂度就是 \(O(n\sqrt n)\) 的,可以通过。

J P8322『JROI-4』少女幻葬

\(\text{Link}\)

首先我们发现所有数都是 \(k\) 的倍数,那么直接把 \(k\) 除掉。此时限制变为 \(\gcd(a_i,a_{i+1})>1\)\(\gcd(a_{i-1},a_i,a_{i+1})=1\)。考虑 dp,令 \(f_{i,j,k}\) 表示 \(a_i=j\)\(\gcd(a_{i-1},a_i)=k\) 的方案数,那么有转移方程:

\[f_{i,a,\gcd(a,j)}=\sum f_{i-1,j,k}\times [\gcd(a,k)=1] \]

注意这里我们先不管 \(\gcd(a,j)=1\),在最后清空即可。然后我们直接莫比乌斯反演可得:

\[\begin{aligned} &f_{i,a,\gcd(a,j)}=\sum f_{i-1,j,k}\sum _{p\mid \gcd(a,k)}\mu(p)\\ \Rightarrow &f_{i,ap,\gcd(ap,j)}=\sum _{p}\mu(p)\sum_{p\mid k} f_{i-1,j,k}\\ \end{aligned} \]

发现此时 \(a,j\) 一定都是 \(p\) 的倍数,所以左边我们可以同时除掉 \(p\),最后乘回去即可。

在枚举完 \(p\) 之后,我们令 \(F_j=\mu(p) \sum\limits_{p\mid k} f_{i-1,jp,k}\)。接下来枚举 \(a\),那么实际上,如果我们再令 \(G_k=[k=a]\),那么上面的式子就是对 \(F,G\)\(\gcd\) 卷积然后存到 \(f_{i,a,*}\) 中。直接暴力做复杂度承受不了,不过我们发现对于 \(G\) 进行一次变换之后,只有 \(d(a)\) 个位置上有值,那么我们只考虑这几个位置上的值即可。

最后复杂度是 \(O(nm\log^2 m)\),略微卡常即可通过。

K CF868G El Toll Caves

\(\text{Link}\)

首先容易发现的是我们对于每个洞穴选择的次数要尽量平均,那么我们一定是以 \(k\) 为一段循环查询每一个洞穴。设洞穴编号为 \(0\sim n-1\),那么第 \(i\) 轮我们查询的洞穴是 \((i-1)k\bmod n\sim ik-1\bmod n\)。此时发现每 \(\gcd(k,n)\) 个洞穴查询的次数都是一致的,那么他们可以认为是等价的,所以把 \(n,k\) 都先除掉 \(\gcd(k,n)\)

然后接下来我们设 \(f_i\) 表示宝藏在 \(i\) 洞穴中找到的期望天数,那么我们有两个方程:

  • 对于 \(k\le i< n\)\(f_i=f_{i-k}+1\)。因为按照上面的理论,我们在走到 \(i\) 之前必然要先经过 \(f_{i-k}\),所以期望加一。
  • 对于 \(i<k\)\(f_i=\dfrac{1}{2}+\dfrac 12(f_{i+n-k}+1)=\dfrac 1 2 f_{i+n-k}+1\),因为对于这些点要么第一次就成功,要么和上面一样从 \(i+n-k\) 的位置转移过来。

我们发现,如果让下标从 \(0\) 开始按照上述过程 dp,那么实际上我们的下标就是每次加 \(k\) 然后取模 \(n\)。由于 \(\gcd(k,n)=1\),所以 \(ik\bmod n\) 可以取遍 \(0\sim n-1\)。于是我们可以将 \(f_0\) 看作主元,将所有 \(f_i\) 写成 \(kf_0+b\) 的形式,最后根据 \(f_0=f_{n-k}+1\) 解方程解出 \(f_0\) 然后回代即可。复杂度是 \(O(n)\) 的。

考虑优化上述过程, 我们考虑一个函数 \(y=\dfrac{k}{n}x\)。我们认为 \(x\) 每增加 \(1\) 就对应下标增加 \(k\)。那么可以轻易的得到,当 \(x\) 碰到一条铅垂线时,我们当前维护的一次函数 \(kf_0+b\) 需要将 \(b\) 加一;同时,当 \(x\) 碰到一条水平线时,代表下一个位置一定大于 \(n\) 了,我们要将当前的一次函数的 \(k,b\) 除以 \(2\)

那么这是一个很明显的万能欧几里得算法形式的东西,我们维护两个一次函数 \((F,G)\) 分别表示当前的 \(f_i\) 以及 \(f_i\) 的前缀和。那么容易得到 \(\text{U}=(\dfrac{1}{2}x,0),\text{R}=(x+1,x+1)\)。显然这个二元组的乘法运算具有结合律,所以直接套万欧板子即可。最后我们还是根据 \(f_{n-k}\) 列出方程解出 \(f_0\),带入前缀和中即可求出最后答案。复杂度是 \(O(T\log n)\) 的,可以通过。

posted @ 2025-04-30 08:59  UKE_Automation  阅读(41)  评论(0)    收藏  举报