[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的主要内容,如果未能解决你的问题,请参考以下文章

CF923E Perpetual Subtraction

office2019官方正式完整版下载安装教程

linux 查看磁盘信息

Unit 11

July 30th 2017 Week 31st Sunday

无法在 python 3.8 中访问嵌套的 JSON