[cf 947E] Perpetual Subtraction
Posted psimonw
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[cf 947E] Perpetual Subtraction相关的知识,希望对你有一定的参考价值。
题意
现在有个正整数\\(x\\),你要进行\\(m\\)轮操作,每次将\\(x\\)随机变为\\([0, x]\\)中的一个整数。
问\\(m\\)轮之后,这个数为\\(i(0 \\leq i \\leq x)\\)的概率。
题解
考虑一个normaldp:设\\(f_i, j\\)表示第\\(i\\)轮后,这个数为\\(j\\)的概率,则:
\\[
f_i, j = \\sum_k \\geq j f_i - 1, k * \\frac1k + 1
\\]
则可以写出转移矩阵:
\\[
T =
\\beginbmatrix
1 & \\frac12 & \\frac13 & \\ldots & \\frac1n + 1 \\0 & \\frac12 & \\frac13 & \\ldots & \\frac1n + 1 \\0 & 0 & \\frac13 & \\ldots & \\frac1n + 1 \\\\ldots & \\ldots & \\ldots & \\ddots & \\ldots \\0 & 0 & 0 & \\ldots & \\frac1n + 1 \\\\endbmatrix
\\]
设初始向量为\\(\\vec b\\),则最后要求的是\\(T ^ m \\vec b\\)。
这样是\\(\\mathcal O(n ^ 3 \\log n)\\)的。
考虑优化。像这样的线性递推,一般能做到\\(\\mathcal O(n ^ 2)\\),做到\\(\\mathcal O(n \\log n \\log k)\\)的做法很难……
另辟蹊径。有一种高妙的相似对角化做法。
有定理,一个矩阵如果是线性无关的,则必定可以相似对角化。
设\\(S = P T P ^ -1\\),其中\\(P\\)是可逆矩阵,\\(S\\)是对角矩阵。
求这个\\(S\\)的过程一般分为几步:求矩阵\\(T\\)特征值和特征向量->将特征向量当列向量排列于矩阵\\(P\\)中->计算\\(S\\)。
考虑\\(T\\)的特征值,特征值即满足\\(\\exists \\vec v \\neq \\vec 0, T \\vec v = \\lambda \\vec v\\)的\\(\\lambda\\),其充要条件是\\(|T - \\lambda I| = 0\\)。
由于
\\[
|T - \\lambda I|
=
\\left |
\\beginarray
1 - \\lambda & \\frac12 & \\frac13 & \\ldots & \\frac1n + 1 \\0 & \\frac12 - \\lambda & \\frac13 & \\ldots & \\frac1n + 1 \\0 & 0 & \\frac13 - \\lambda & \\ldots & \\frac1n + 1 \\\\ldots & \\ldots & \\ldots & \\ddots & \\ldots \\0 & 0 & 0 & \\ldots & \\frac1n + 1 - \\lambda \\\\endarray
\\right |
=
\\left |
\\beginarray
1 - \\lambda & \\lambda & 0 & \\ldots & 0 \\0 & \\frac12 - \\lambda & \\lambda & \\ldots & 0 \\0 & 0 & \\frac13 - \\lambda & \\ldots & 0 \\\\ldots & \\ldots & \\ldots & \\ddots & \\ldots \\0 & 0 & 0 & \\ldots & \\frac1n + 1 - \\lambda \\\\endarray
\\right |
=
0
\\]
这个行列式直接用定义式求,得出
\\[
(1 - \\lambda)(\\frac12 - \\lambda)\\ldots(\\frac1n + 1 - \\lambda) = 0
\\]
则所有特征值为\\(1, \\frac12, \\ldots, \\frac1n + 1\\)。
接着考虑特征向量,特征值即满足\\(\\exists \\vec v \\neq \\vec 0, T \\vec v = \\lambda \\vec v\\)的\\(\\vec v\\)。
尝试进行小范围的模拟计算,可以得出结果:
满足\\(T \\vec v_i = \\frac1i \\vec v_i\\)的\\(\\vec v_i\\)为
\\[
\\beginbmatrix
(-1) ^ i - 1 \\binomi - 10 \\(-1) ^ i \\binomi - 11 \\\\ldots \\(-1) ^ i + i - 2 \\binomi - 1i - 1 \\0 \\\\ldots \\0 \\\\endbmatrix
\\]
proof1
则
\\[
P =
\\beginbmatrix
1 & -1 & 1 & \\ldots & (-1) ^ n \\binomn0 \\0 & 1 & -2 & \\ldots & (-1) ^ n + 1 \\binomn1 \\0 & 0 & 1 & \\ldots & (-1) ^ n + 2 \\binomn2 \\\\ldots & \\ldots & \\ldots & \\ddots & \\ldots \\0 & 0 & 0 & \\ldots & (-1) ^ n + n \\binomnn \\\\endbmatrix
\\]
而
\\[
P ^ -1 =
\\beginbmatrix
1 & 1 & 1 & \\ldots & \\binomn0 \\0 & 1 & 2 & \\ldots & \\binomn1 \\0 & 0 & 1 & \\ldots & \\binomn2 \\\\ldots & \\ldots & \\ldots & \\ddots & \\ldots \\0 & 0 & 0 & \\ldots & \\binomnn \\\\endbmatrix
\\]
proof2
又因为\\(S = P T P ^ -1\\)即\\(T = P ^ -1 S P\\)。有了\\(P\\),\\(S\\)能用几次多项式卷积快速计算出。
但是如果\\(S\\)没有好的性质,也是无济于事的。但是事实证明,\\(S\\)是一个对角矩阵。
proof3
则
\\[
\\beginaligned
ans
& = T ^ m \\vec b \\& = (P ^ -1 S P) ^ m \\vec b \\& = P ^ -1 S (P P ^ -1 S) ^ m - 1 P \\vec b \\& = P ^ -1 S ^ m P \\vec b \\\\endaligned
\\]
考虑对角矩阵的幂次很好求,相当于把\\(\\vec b\\)和前面几个矩阵依次用卷积卷一卷就出来了。
复杂度是\\(\\mathcal O(n \\log m + n \\log n)\\)的。
proof1:
即证明\\(T \\vec v_i = \\lambda_i \\vec v_i\\),亦即\\(\\sum_j T_k, j \\vec v_i, j = \\lambda_i \\vec v_i, k\\)。
如下:
\\[
\\beginaligned
\\sum_j T_k, j \\vec v_i, j
& = \\sum_j = k ^ n \\frac1j + 1 (-1) ^ i + j \\binomij \\& = \\sum_j = k ^ n \\frac1j + 1 (-1) ^ i + j \\fraci!j!(i - j)! \\& = \\frac1i + 1 \\sum_j = k ^ n (-1) ^ i + j \\frac(i + 1)!(j + 1)!(i - j)! \\& = \\frac1i + 1 \\sum_j = k ^ n (-1) ^ i + j \\binomi + 1j + 1 \\& = \\frac1i + 1 \\sum_j = k ^ n (-1) ^ i + 1 \\binomj - i - 1j + 1 \\& = \\frac(-1) ^ i + 1i + 1 \\sum_j = k ^ n \\binomj - i - 1j + 1 \\& = \\frac(-1) ^ i + 1i + 1 [\\binomi - i - 1 + 1i + 1 - \\binomk - i - 1k] \\& = \\frac(-1) ^ ii + 1 \\binomk - i - 1k \\& = (-1) ^ i + k \\binomik \\& = \\lambda_i v_i, k \\\\endaligned
\\]
其中用到了杨辉三角一斜列求和和牛顿二项式定理的导出式。
杨辉三角一斜列求和:
\\[
\\sum_i = l ^ r \\binom n + im + i = \\binomn + r + 1m + r - \\binomn + lm + l - 1
\\]
牛顿二项式定理的导出式:
\\[
\\binom-nm = (-1) ^ m \\binomn + m - 1m
\\]
proof2:
即证明:
\\[
\\sum_k = 1 ^ n P ^ -1_i, k P_k, j = [i = j]
\\]
又因为
\\[
P ^ -1_i, j = \\binom ji = \\sum_k = 0 ^ n [k = i] \\binomjk
\\]
通过二项式反演,得
\\[
[j = i] = \\sum_k = 0 ^ n (-1) ^ j - k P ^ -1_i, k \\binomjk
\\]
则
\\[
\\beginaligned
\\sum_k = 1 ^ n P ^ -1_i, k P_k, j
& = \\sum_k = 1 ^ n (-1) ^ j + k \\binomjk P ^ -1_i, k \\& = \\sum_k = 0 ^ n (-1) ^ j - k \\binomjk P ^ -1_i, k \\& = [i = j]
\\endaligned
\\]
proof3:
由于
\\[
\\beginaligned
T P
& = T [\\vec v_1, \\vec v_2, \\vec v_3, \\ldots, \\vec v_n + 1] ^ T \\& = [T \\vec v_1, T \\vec v_2, T \\vec v_3, \\ldots, T \\vec v_n + 1] ^ T \\& = [\\lambda_1 \\vec v_1, \\lambda_2 \\vec v_2, \\lambda_3 \\vec v_3, \\ldots, \\lambda_n + 1 \\vec v_n + 1] ^ T \\& = P \\textdiag(\\lambda_1, \\lambda_2, \\lambda_3, \\ldots, \\lambda_n + 1) \\\\endaligned
\\]
则
\\[
P ^ -1 T P = \\textdiag(\\lambda_1, \\lambda_2, \\lambda_3, \\ldots, \\lambda_n + 1) \\\\]
即\\(S = P ^ -1 T P\\)是对角阵\\(\\textdiag(\\lambda_1, \\lambda_2, \\lambda_3, \\ldots, \\lambda_n + 1)\\)。
另附生成函数做法(图片出自_rqy‘s Blog
)。
以上是关于[cf 947E] Perpetual Subtraction的主要内容,如果未能解决你的问题,请参考以下文章