Gravatar
┭┮﹏┭┮
积分:4441
提交:907 / 1937

挺好的递推+恶心的矩阵快速幂题

题面:有一个n行m列的棋盘,在当前位置可以瞬移,每次可向右瞬移奇数列,且瞬移到本行或相邻行,并且不能瞬移出棋盘,问从$(1,1)至(n,m)$的总方案数

首先考虑递推,设$f(i,j)$为投当前在第i行第j列的方案数,因为每次可以向右瞬移,所以$f(i,j)$可以由上一列,上上上一列...推出来,且可以由上一行和下一行推出

则递推转移方程式为$f(i,j) = \sum_{k=j-w,w=1,w+=2}^j f(i,k)+f(i-1,k)+f(i+1,k)$

这样直接枚举是$O(nm^2)$的复杂度,肯定是不行的,那我们继续考虑

我们设$g(i,j) = \sum_{k=j-w,w=1,w+=2}^j f(i,k) = g(i,j-2) + f(i,j-1)$

则方程式转为$f(i,j) = g(i-1,j) + g(i,j) + g(i+1,j) = g(i-1,j-2) + f(i-1,j-1) + g(i,j-2) + f(i,j-1) + g(i+1,j-2) + f(i+1,j-1)$

我们在维护$f$的同时维护$g$则时间复杂度会降到$O(nm)$

一看数据$10^9$,再次拿出我们的dz,一眼鉴定为矩阵快速幂

然后就开始我们快(恶)乐(心)的推转移矩阵的时候:

根据转移方程我们可以分成两种情况,即上一列的方案和上上一列的方案,因为上上一列的方案数在推下一列的方案数时要用到,所以不能去掉,我们都需要记录,所以需要当推到$f(i,j)$时,我们需要$f(i,j-1), g(i,j-1), g(i,j-2)$把这三列归为一列,$1至n$为$f(i,j-1)$,$n+1至2n$为$g(i,j-1)$,$2n+1至3n$为$g(i,j-2)$最后该矩阵的长度为$3n$最大为150,则我们转移矩阵大小为$3n * 3n$

先看应该怎样转移

$$\begin{bmatrix}f(1,j-1) & f(2,j-1) & ... & f(n,j-1) & g(1,j-1) & g(2,j-1) & ... & g(n,j-1) & g(1,j-2) & g(2,j-2) & ... & g(n,j-2) \\\end{bmatrix}$$

应该转移为

$$\begin{bmatrix}f(1,j) & f(2,j) & ... & f(n,j) & g(1,j) & g(2,j) & ... & g(n,j) & g(1,j-1) & g(2,j-1) & ... & g(n,j-1) \\\end{bmatrix}$$

所以根据递推转移方程考虑转移矩阵,则可推出矩阵为:

设转移矩阵为$c(i,j)$

首先先看f的矩阵:根据递推方程 当$f(i,j)$时 只需将$c(i-1,i),c(i,i),c(i+1,i)$设为1,才加上$g$即将$c(2*n+i-1,i),c(2*n+i,i),c(2*n+i+1,i)$再设为1就可以了

再考虑$g(i,j)$ 由递推方程式得 应当将$c(i,i+n),c(i+2*n,i+n)$置为1即可

最后看$g(i,j-1)$ 在转移前已经出现,不需要推,所以只要将$c(i+n,i+2*n)$置为1即可

(因为矩阵实在太大画不下,只好描述一下)

Oo最后开始愉悦的矩阵快速幂时刻oO

复杂度为$O(150^3*log(1e9))$,大约为$1e8$所以跑的飞慢qwq

二维递推实在痛苦┭┮﹏┭┮










题目2976  偷笔记 AAAAAAAAAA      9      评论
2023-11-21 20:41:53    
Gravatar
┭┮﹏┭┮
积分:4441
提交:907 / 1937

挺好的递推+矩阵快速幂题

题面:有一个m面的骰子,问投n次使投到第6面为偶数次的方案数

首先考虑递推,设f(i,j,k)为投i次的情况,j为0或1 (0为本次未投到第6面,1为投到了),k为0或1 (当前投到第6面次数的奇和偶,0为偶,1为奇)

转移方程为$f(n,1,0) = f(n-1,1,1) + f(n-1,0,1)$

$f(n,1,1) = f(n-1,1,0) + f(n-1,0,0)$

$f(n,0,0) = m-1 * f(n-1,1,0) + m-1 * f(n-1,0,0)$

$f(n,0,1) = m-1 * f(n-1,1,1) + m-1 * f(n-1,0,1)$

看到n的范围$10^{18}$ wow,一眼dz,肯定要快速幂,根据递推可以想到矩阵快速幂,下面开始推转移矩阵

可以想到

$$\begin{bmatrix}f(n-1,1,0) & f(n-1,1,0) & f(n-1,0,0) & f(n-1,0,1) \\\end{bmatrix}$$

应该转移为

$$\begin{bmatrix}f(n,1,0) & f(n,1,0) & f(n,0,0) & f(n,0,1)\end{bmatrix}$$

所以根据递推转移方程考虑转移矩阵,则可建出矩阵为:

$$\begin{bmatrix}0 & 1 & m-1 & 0\\1 & 0 & 0 & m-1\\0 & 1 & m-1 & 0\\1 & 0 & 0 & m-1\\\end{bmatrix}$$

初始矩阵为$f(1)$ 即 $\begin{bmatrix}0 , 1 , m-1 , 0\end{bmatrix}$

OO最后直接跑矩阵快速幂就行了OO

复杂度为$O(4^3*log(n))$

好像这道题还有数学方法,但不会





题目2420  五彩的色子 AAAAAAAAAA      12      3 条 评论
2023-11-17 11:31:07    
Gravatar
op_组撒头屯
积分:3060
提交:341 / 681

给一个线性做法。

我们依次计算每个字符的最小值,采用双指针维护。

具体的,记当前字符为 $c$,维护两个指针 $l,r$,表示第 $l$ 个 $c$ 到第 $r$ 个 $c$ 能否全部并到一起。若可以就 $r$ 右移,否则 $l$ 右移。

问题转化为将区间 $[l,r]$ 全部并到一起的最小代价。注意到最优方案中一定有一个点不动,它两侧的点向它靠拢,我们再维护一个指针 $mid$ 表示这个点,那么当前代价为

$$\sum_{i=l}^{mid-1}{[(p_{mid}-mid+i)-p_i]}+\sum_{i=mid+1}^r{[p_i-(p_{mid}+i-mid)]}$$

$$=\sum_{i=l}^{mid-1}{(p_i-i)}-\sum_{i=mid+1}^{r}{(p_i-i)}-(r-mid)(p_{mid}-mid)+(mid-l)(p_{mid}-mid)$$

其中 $p_i$ 表示第 $i$ 个 $c$ 的下标。注意到我们预处理 $p_i-i$ 的前缀和即可 $O(1)$ 算出这个式子。

注意到这个式子关于 $mid$ 是下凸的,当 $l$ 和 $r$ 右移时,最优的 $mid$ 也是单调右移的,我们在双指针的同时维护 $mid$ 即可。

由于三个指针都单调右移,时间复杂度为 $O(L)$。


题目3942  收集弹珠      8      评论
2023-11-15 18:26:01    
Gravatar
op_组撒头屯
积分:3060
提交:341 / 681

“引爆逆天力量,追寻圆环之理的神藏奥秘”最新力作。

乍一看这式子感觉纯纯逆天,这种带位运算的复杂式子肯定考虑拆位。记 $w_{i,j,k}$ 为 $d_{i,j}\oplus a_{i,j}$ 的第 $k$ 位,$w_{e,k}$ 为 $d_u \oplus d_v$ 的第 $k$ 位,化一下式子

$$ans=\sum_i \sum_j \sum_k {w_{i,j,k}b_{i,j}} + \sum_e \sum_k {w_{e,k}c_e} = \sum_k{2^k(\sum_i \sum_j {w_{i,j,k}b_{i,j}} + \sum_e {w_{e,k}c_e})}$$

此时也能看出 $d$ 的每一位是相互独立的,于是我们分开算,考虑每一位的最小值。

显然可以状压 dp,记 $f_{i,S}$ 表示第 $i$ 列填的状态为 $S$,前 $i$ 列的最小值。

转移直接枚举上一列填了什么即可,再加上三个代价:第 $i$ 列的点,第 $i$ 列的边,第 $i$ 列和第 $i-1$ 列之间的边。

时间复杂度 $O(m4^n\log V)$,理论上界大概是 $2e8$,然而最慢的点也不到 $800ms$,很神奇吧常数。





题目3113  [BZOJ 4676] Xor-Mul 棋盘      9      评论
2023-11-14 19:14:02    
Gravatar
op_组撒头屯
积分:3060
提交:341 / 681

“引爆逆天力量,追寻圆环之理的神藏奥秘”第二作!

考虑将期望得分拆到每对点对上,也就等于选中每对点对的概率之和。而选中某对点对的概率显然都是相同的,于是直接用点分治统计好的点对的数量,再乘以概率即可。

概率是多少?记当前这个人要选 $c$ 个点,相当于 $n$ 个位置中有 $c$ 个特殊的,而两个点都放在特殊位置的概率,即 $p=\frac{c(c-1)}{n(n-1)}$。

时间复杂度 $O(n\log n)$。注意分母别爆 int 了。


题目3112  [BZOJ 4675] 点对游戏      8      评论
2023-11-14 18:52:42    
Gravatar
op_组撒头屯
积分:3060
提交:341 / 681

开个新坑,系列名叫“引爆逆天力量,追寻圆环之理的神藏奥秘”(来源:ChatGPT3.5)。

对于树上所有两点距离的问题,考虑点分治。记当前分治中心为 $C$,对于在分治范围内的点 $u$,考虑计算所有经过 $C$ 的路径对 $u$ 的贡献。记 $f_i$ 表示与 $C$ 距离为 $i$ 的点的个数,若 $u$ 与 $C$ 的距离为 $d$,那么对 $u$ 的贡献为

$$\Delta_u=\sum_{i=0}^{D}{f_i w_{i+d}}$$

其中 $D$ 为分治范围到 $C$ 的最大距离。注意到这是一个差卷积的形式,处理方式是将 $f$ 倒置,即 $f'_i=f_{D-i}$,那么有

$$\Delta_u=\sum_{i=0}^{D}{f'_{D-i} w_{i+d}}=[x^{D+d}](\sum_{i}{f'_i x^i})(\sum_{i}{w_i x^i})$$

使用 NTT 计算卷积即可。然后再类似的减去 $u$ 所属子树对它的贡献。

注意到卷积只用计算前 $2D$ 位,这样就可以保证复杂度为 $O(n\log^2 n)$。以及答案最大 $1e9$,NTT 质数可以取 $1004535809$,原根为 $3$。






题目3176  树上的距离      10      评论
2023-11-13 19:13:25