Loading

ARC202 小记

A (Merge and Increment)

题意

对于一个序列,定义一次操作为:消除相邻两个 \(=x\) 的数,在同一位置插入 \(x+1\)

若一个序列能通过若干次操作长度变为 \(1\),则称其是好的

给定一个长度为 \(n\) 的序列 \(a\),求最少往 \(a\) 中插入几个数使得其变成好的。其中插入可以往任意位置插入任意数。

\(1\le n\le 2\times 10^5,a_i\in [1,10^9]\)

题解

xjb 猜结论贪心。

我最开始猜了一个:每次选择当前最小值(若多个选最前),找到其左右两侧最小的,把这两个数合并更新,就是 \((x,y)\to \max(x,y)+1\)

但是这个结论有点小问题:比如 1 1 1 1 1 2 的时候,先合并成 2 2 1 2,然后第三个 \(1\) 可能和左边的 \(2\) 合并,就坠机了。

这启发我们每次先抬升 \((x,y)\to (\max(x,y),\max(x,y))\),然后再从左到右继续抬升 \((x,x)\to x+1\),这样就是对的了。

注:这东西和官方题解的结论是本质相同的,可以仔细想想。

对顶堆链表 维护即可,复杂度 \(O(n\log n)\)

\(\bf{record}\)

B (Japanese "Knight's Tour")

题意

有一个 \([0,H-1]\times [0,W-1]\) 的棋盘,初始你在 \((0,0)\) 位置有一个马。

马每次可以从 \((x,y)\to (x-2,y\pm 1)\),其中坐标分别 \(\bmod H,\bmod W\)

要求马通过 \(H\times W\) 次遍历所有位置,最终回到 \((0,0)\)

求不同的方案数,对 \(998244353\) 取模。

\(3\le H,W\le 2\times 10^5\)

题解

  • 下面把原题的 \((H,W)\) 重新定义为 \((n,m)\)

首先注意到第 \(k\) 步所在的行位置是固定的:\((-2k)\bmod n\)

于是我们把行重排列:\(0\to -2\to -4\to \cdots\)

  • 发现当 \(n\) 为偶数的时候奇数行遍历不到,答案为 \(0\)

否则重定义移动为:\((+1,-1),(+1,+1)\),要求遍历整个棋盘并且回到 \((0,0)\)


形式化描述第 \(i\) 步的移动为:\((+1,+d_i),d_i=\pm 1\)

\(x_k=k\bmod n,y_k=\sum\limits_{i=1}^{k} d_i\bmod m\)​,我们重定义要求:

要求当 \(k\in [1,nm]\)\((x_k,y_k)\) 两两不同,\((x_{nm},y_{nm})=(0,0)\)。求选择 \(d\)​​ 的方案数。

\(y\) 写成 \(\color{red}{m\times n}\) 的数表,要求变为每列的 \(y\)​​ 两两不同,\(x_{nm}=y_{nm}=0\)

于是每列 \(y\) 构成 \(0\sim m-1\) 的排列。

同时把 \(x,y,d\) 的下标也拍到二维上。

下面用 \(x_{a,b}\) 来称呼 \(x_{(b-1)m+a}\)


  • \(m\) 奇数

作差 相邻两列和,由于都是 \(1\sim m\) 排列,于是和相同。举例 \(1,2\) 列:

\[\sum y_{x,1}-y_{x,2}\equiv 0\pmod m \\ \sum -d_{x,2}\equiv 0\pmod m \]

由于 \(m\) 是奇数,若干个 \(\pm 1\) 合成 \(\bmod m=0\) 的数,于是只能都是 \(+1\)\(-1\)​。

其他行同理,第一行随便分析下发现也一样。


  • \(m\) 偶数

分析奇偶性,举例 \(1,2\) 列:发现 \(y_{2k+1,1}\) 构成 \(1,3,\cdots,m-1\)\(y_{2k+1,2}\) 构成 \(2,4,\cdots,m\)

依然作差有:

\[\sum y_{2k+1,1}-y_{2k+1,2}\equiv -\dfrac{m}{2}\pmod m \\ \sum -d_{2k+1,2}\equiv -\dfrac{m}{2}\pmod m \]

于是 \(d_{2k+1,2}\) 这堆数也只能全 \(1\) 或全 \(-1\)​。

其他行同理,第一行随便分析下发现也一样。


\(m\) 为奇数的时候相当于钦定 \(n\)\(\pm 1\) 的数,设这些和为 \(s\)

要求 \(\{s,2s\cdots,ms\}\)\(\bmod m\) 下两两不同,等价于 \((s,m)=1\)

同理,\(m\) 为偶数的时候相当于钦定 \(2n\)\(\pm 1\)​。


\(F(n,m)\) 表示选 \(n\)\(\pm 1\),使得 \((s,m)=1\) 的方案数。

\(F(n,m)=\sum\limits_{i=0}^{n}\dbinom{n}{i}[(2i-n,m)=1]\),直接 \(\mathcal{O}(n\log n)\) 计算即可,瓶颈在于 \(\gcd\)

奇数时答案为 \(F(n,m)\),偶数时为 \(F(2n,m)\)

\(\bf{record}\)

C (Repunits)

题意

定义 \(R(k)=11\cdots1\),其中总共有 \(k\)\(1\)

给定长为 \(n\) 的序列 \(a_1,a_2,\cdots,a_n\),定义 \(\forall k\in [1,n],ans_k=\mathop{\text{lcm}}\limits_{1\le i\le k} R(a_i)\)

\(ans_{1},ans_2,\cdots,ans_n\),对 \(998244353\) 取模。

\(1\le n,a_i\le 2\times 10^5\)

题解

写了和官方题解同复杂度的 \(\mathcal{O}(N\log \log N)\) 的做法,其中 \(N=\max(n,m)\)。截止 \(2025/7/22\)AT 全站最优解,代码也很短。

前置知识:\(\gcd-\,\text{lcm}\) 反演,狄利克雷前缀和那一套,\(\mathcal{O}(n)\)\(n\) 个数逆元。


注意到:\(R(a)=\dfrac{10^a-1}{9},\quad\gcd(R(a),R(b))=\dfrac{1}{9}\gcd(10^a-1,10^b-1)=\dfrac{10^{\gcd(a,b)}-1}{9}=R(\gcd(a,b))\)

于是 \(\gcd\limits_{x\in S} R(x)=R(\gcd(S))\)

我们暂时只讨论 全局答案,先推一推。

先来个 \(\gcd-\,\text{lcm}\) 反演:

\[ans=\prod\limits_{d} R(d)^{f(d)} \\ f(d)=\sum\limits_{S\sube [a]} (-1)^{|S|-1}[\gcd(S)=d] \]

然后 \(\gcd=d\) 不好做,容斥成 \(d\mid\gcd\)

\[g(d)=\sum\limits_{S\neq \varnothing} (-1)^{|S|-1}[d\mid\gcd(S)]=-\sum\limits_{i=1}^{n_d} (-1)^i\dbinom{n_d}{i}=[n_d>0] \\ f(d)=\sum\limits_{d\mid n}\mu(n/d)g(n) \]

其中 \(n_d\) 表示 \(a\) 中是 \(d\) 的倍数的数的个数。

\[ans=\prod\limits_{d} R(d)^{\sum_{d\mid k} \mu(k/d)g(k)}=\prod\limits_{k} z(k)^{[n_k>0]} \\ z(n)=\prod\limits_{d\mid n} R(d)^{\mu(n/d)} \]


预处理 \(R,\mu,z\) 等。

加入 \(x\) 的时候,计算 \(x\) 的因数 \(d\) 加入后对 \([n_d>0]\) 的影响,然后贡献乘到答案。

复杂度 \(\mathcal{O}(N\log N)\)\(\mathcal{O}(N\log mod)\),足以通过此题。


接下来一个个优化,先来预处理 \(z\)

我们记录 \(R(1\sim n)\)\(R(1\sim n)^{-1}\),用个线性逆元做到线性。

然后对于 \(z(n)=\prod\limits_{d\mid n} R(d)^{\mu(n/d)}\) 看成乘积形式的 狄利克雷前缀差分,同时维护 \(x,x^{-1}\) 转移,就解决了除法。


\(ans_k\) 写好看点:

\[ans_k=\prod\limits_{d:\,\exist\,d\mid A_i,i\in [1,k]} z(d) \]

于是我们只需对每个 \(d\) 记录其最早出现在乘积里的时刻即可。

初始 \(t_{1\sim n}=+\infty\),然后遍历 \(x\in [1,n],t_x\overset{\min}{\longleftarrow}x\),最后 \(t'_x=\min\limits_{x\mid d}t_d\)

求得的 \(t'\) 就是最早出现的时刻。用狄利克雷后缀 \(\min\) 优化即可。

于是总复杂度做到 \(\mathcal{O}(N\log \log N)\),是目前科技的最优解。

\(\bf{record}\)

D (King)

题意

给定 \([1,n]\times [1,m]\) 的棋盘,一个王要恰好 \(T\) 步从 \((A,B)\) 走到 \((C,D)\),并且不能走出棋盘。

求不同游走方案数,对 \(998244353\) 取模。

  • 王能移动到相邻八连通位置。即从 \((i,j)\) 能移动到 \((i+1,j+1),(i+1,j),(i+1,j−1),(i,j+1),(i,j−1),(i−1,j+1),(i−1,j),(i−1,j−1)\)

\(1\le n,m,T,A,B,C,D\le 3\times 10^5\)5s

题解

这里给出一个 不用多项式乘法\(\mathcal{O}(T^{1.5})\) 的做法。事实上这个比用多项式乘法略微困难。


首先由于王不能静止,我们进行容斥,来独立出横纵坐标。

\(q_i\) 表示王每次 能走或者静止,走 \(i\) 步走到 \((C,D)\) 的方案数。

根据二项式反演,容易得出:

\[ans=\sum\limits_{i=0}^{T} \dbinom{T}{i}(-1)^{T-i}q_i \]

接下来 \(q_i\) 可以拆封成 \(A\to C,B\to D\) 两部分。

我们只需 \(\forall 0\le i\le T\) 求出 \(F(n,A,C,i)\),表示:

初始 \(x=A\),每次 \(x\gets x+\Delta(\Delta\in [-1,1])\)\(x\) 始终在 \([1,n]\) 范围内。最终 \(n\) 次后 \(x=C\) 的方案数。

那么 \(q_i=F(n,A,C,i)F(m,B,D,i)\),接下来计算 \(F\)


这东西首先想到 反射容斥

假设我们对于固定的 \(d\),能快速处理出 \(f_k=[x^d](x^{-1}+1+x)^k,k\in [0,T]\)

那么直接套用 双直线反射容斥,总共进行 \(\mathcal{O}(\frac{T}{n})\) 轮。

每轮计算出反射后的 \(d=|A'-C'|\),计算出对应的 \(f_i\),乘上容斥系数并贡献,即 \(op\times f_i\to F(n,A,C,i)\)

假设我们能 \(\mathcal{O}(T)\) 预处理出上面的 \(f\),那么此时复杂度 \(\mathcal{O}(\frac{T^2}{n})\)

再拼上一个暴力 \(\mathcal{O}(nT)\)dp,平衡取 \(n=\mathcal{O}(\sqrt T)\) 即可。


接下来给定 \(d\),想 \(\mathcal{O}(T)\) 预处理 \(f_k=[x^d](x^{-1}+1+x)^k,k\in [0,T]\)

为了便利 懒惰的读者,我们先直接给出做法:

\(f_0=[d=0],g_0=[d=1]\),递推:

\[f_i=\dfrac{i}{d+i}(f_{i-1}+2g_{i-1}) \\ g_i=\dfrac{i}{i-d+1}(2f_{i-1}+g_{i-1}) \]

特别的,若 \(i=d-1\),则 \(f_i=0,g_i=1\)

最终求得的 \(f\) 就是答案。


下面是出推导过程。

\(c_{k,i}=[x^{d+i}](x^{-1}+1+x)^k=[x^{d+k+i}](1+x+x^2)^k\),那么 \(f_k=c_{k,0}\)

然后非常巧妙的,我们先写一个 \(k\to k+1\) 的二维递推。再写一个 微分有限,表示固定 \(k\),对于 \(i\) 这一维的递推。

然后两个递推结合起来,就能算了。


二维递推:

\[c_{k,i}=c_{k-1,i+1}+c_{k-1,i}+c_{k-1,i-1} \]

微分有限:

\(\begin{aligned} &f=(1+x+x^2)^k,f_i=[x^i]f,f'_i=[x^i]f' \\ \\ &f'=k(2x+1)(1+x+x^2)^{k-1}\Rightarrow (1+x+x^2)f'=k(2x+1)f \\ \\ &f'_{n-2}+f'_{n-1}+f'_{n}=k(2f_{n-1}+f_n)\Rightarrow (n-1)f_{n-1}+nf_{n}+(n+1)f_{n+1}=2kf_{n-1}+kf_n \\ \\ &(n+1)f_{n+1}=(k-n)f_n+(2k-n+1)f_{n-1} \end{aligned}\)


根据微分有限,对于 \(c\),带入 \(i=0\)\(i=-1\)

\[\begin{aligned} (d+k+1)c_{k,1} = -d \cdot c_{k,0} + (k-d+1)c_{k,-1} \\ (d+k)c_{k,0} = (1-d)c_{k,-1} + (k-d+2)c_{k,-2} \end{aligned}\]

带入

\[\begin{aligned} c_{k,0} = c_{k-1,1} + c_{k-1,0} + c_{k-1,-1} \\ c_{k,-1} = c_{k-1,0} + c_{k-1,-1} + c_{k-1,-2} \end{aligned}\]

整理得:

\[\begin{aligned} \boldsymbol{(d+k) c_{k,0} = k c_{k-1,0} + 2k c_{k-1,-1}} \\ \boldsymbol{(k-d+1) c_{k,-1} = 2k c_{k-1,0} + k c_{k-1,-1}} \end{aligned}\]

\(f_k=c_{k,0},g_k=c_{k,-1}\) 即可得到 \(f,g\) 递推式。


代码是目前所有 有效提交 的最短解,但是速度可能比一些用 NTT 的选手慢。

\(\bf{record}\)

posted @ 2025-07-21 09:02  HaHeHyt  阅读(64)  评论(0)    收藏  举报