贺了一遍题解/kk

题目大意.

你手上有一个二进制数 x,这个数会经历若干次以下操作

  • 对于每一位,有 pi​ 的概率不变,有 (1pi)q​ 的概率变为 0​,有 (1pi)(1q)​ 的概率变为 1​。

对于每个 x[0,2n),求:期望经过多少次操作能首次回到 x

n20​。保证你在计算过程中不需要求 0​​​ 的乘法逆。

Part 1 - 随机游走

首先直接写出这个随机游走过程的方程。记 J 是全 1 矩阵,E 是答案向量,M 是转移矩阵,我们有

T=TM+Jdiag(E0,E1,...,E2n1)

说人话就是:"所有未结束的路径去掉最后一步一定也是未结束的路径;而一条未结束的路径再走一步要么结束要么不结束"。

也即

T(IM)=Jdiag(E)

顺带一提,这里看似只有 22n 个方程,不够解出 TE,但应当注意到 T 在主对角线上是 0。不过"主对角线上全为 0"这个性质还真不太好描述和利用,下面介绍一个方法,它能直接删去 T 这个未知数。(参考资料:《浅谈图模型上的随机游走问题》王修涵)

我们知道,M 这个转移矩阵描述的是一个连通图,由此不难证明 IM 的秩为 2n1,也就是说它的核是一个维数为 1 的线性空间。设向量 X 满足

(IM)X=0

于是

JX=diag(E)X

从而,

i,xj=xiEi

于是问题变为求 X

Part 2 - 线性代数

也就是 X=MX

然后我们来仔细分析转移矩阵的性质,它应当是

M=qi=0n1[101pipi]+(1q)i=0n1[pi1pi01]

其中 表示 Kronecker 积

如果只有 i=0n1[101pipi]​,那么它已经是一个下三角矩阵,我们只需要钦定好 x0​ 然后一个一个往回代,和求逆一样做就好了。直接实现是 O(22n)​。

然而我们如果仔细看一眼这个矩阵,就能发现一些有趣的事情:

其中蓝色的是首次出现的块,不能从前面的计算中继承;其他的块都是继承来的。可见每行最多被分为 n 块,于是时间复杂度为 O(n2n)

好的,现在回到 M​。下面我们来表明,M​ 相似于一个与 i=0n1[101pipi]​​ 有类似性质的矩阵。

具体来说:我们知道多项式的高次幂问题可以考虑对角化,而 Kronecker 积也是如此。我们有

i=0n1[101pipi]=i=0n1[1110][11pi0pi][0111]=[1110]n(i=0n1[11pi0pi])[0111]n
i=0n1[pi1pi01]=i=0n1[1110][100pi][0111]=[1110]n(i=0n1[100pi])[0111]n

Θ=[1110]n,从而

M=Θ(qi=0n1[11pi0pi]+(1q)i=0n1[100pi])Θ1

M=ΘLΘ1。从而,

X=MXΘ1X=LΘ1X

于是我们用 L 跑一遍之前的算法就可以得到 Θ1X,而它和 X 的差别就是一个 FWT。

妈的好像推错了,可能哪里行和列搞反了。被我瞎搞一通后这份代码能过。