[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} * \frac{1}{k + 1}
\]
则可以写出转移矩阵:
\[
T =
\begin{bmatrix}
1 & \frac{1}{2} & \frac{1}{3} & \ldots & \frac{1}{n + 1} \0 & \frac{1}{2} & \frac{1}{3} & \ldots & \frac{1}{n + 1} \0 & 0 & \frac{1}{3} & \ldots & \frac{1}{n + 1} \\ldots & \ldots & \ldots & \ddots & \ldots \0 & 0 & 0 & \ldots & \frac{1}{n + 1} \\end{bmatrix}
\]
设初始向量为\(\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 |
\begin{array}
1 - \lambda & \frac{1}{2} & \frac{1}{3} & \ldots & \frac{1}{n + 1} \0 & \frac{1}{2} - \lambda & \frac{1}{3} & \ldots & \frac{1}{n + 1} \0 & 0 & \frac{1}{3} - \lambda & \ldots & \frac{1}{n + 1} \\ldots & \ldots & \ldots & \ddots & \ldots \0 & 0 & 0 & \ldots & \frac{1}{n + 1} - \lambda \\end{array}
\right |
=
\left |
\begin{array}
1 - \lambda & \lambda & 0 & \ldots & 0 \0 & \frac{1}{2} - \lambda & \lambda & \ldots & 0 \0 & 0 & \frac{1}{3} - \lambda & \ldots & 0 \\ldots & \ldots & \ldots & \ddots & \ldots \0 & 0 & 0 & \ldots & \frac{1}{n + 1} - \lambda \\end{array}
\right |
=
0
\]
这个行列式直接用定义式求,得出
\[
(1 - \lambda)(\frac{1}{2} - \lambda)\ldots(\frac{1}{n + 1} - \lambda) = 0
\]
则所有特征值为\(1, \frac{1}{2}, \ldots, \frac{1}{n + 1}\)。

接着考虑特征向量,特征值即满足\(\exists \vec v \neq \vec 0, T \vec v = \lambda \vec v\)的\(\vec v\)。
尝试进行小范围的模拟计算,可以得出结果:
满足\(T \vec v_i = \frac{1}{i} \vec v_i\)的\(\vec v_i\)为
\[
\begin{bmatrix}
(-1) ^ {i - 1} \binom{i - 1}{0} \(-1) ^ {i} \binom{i - 1}{1} \\ldots \(-1) ^ {i + i - 2} \binom{i - 1}{i - 1} \0 \\ldots \0 \\end{bmatrix}
\]



proof1

\[
P =
\begin{bmatrix}
1 & -1 & 1 & \ldots & (-1) ^ n \binom{n}{0} \0 & 1 & -2 & \ldots & (-1) ^ {n + 1} \binom{n}{1} \0 & 0 & 1 & \ldots & (-1) ^ {n + 2} \binom{n}{2} \\ldots & \ldots & \ldots & \ddots & \ldots \0 & 0 & 0 & \ldots & (-1) ^ {n + n} \binom{n}{n} \\end{bmatrix}
\]

\[
P ^ {-1} =
\begin{bmatrix}
1 & 1 & 1 & \ldots & \binom{n}{0} \0 & 1 & 2 & \ldots & \binom{n}{1} \0 & 0 & 1 & \ldots & \binom{n}{2} \\ldots & \ldots & \ldots & \ddots & \ldots \0 & 0 & 0 & \ldots & \binom{n}{n} \\end{bmatrix}
\]
proof2
又因为\(S = P T P ^ {-1}\)即\(T = P ^ {-1} S P\)。有了\(P\),\(S\)能用几次多项式卷积快速计算出。
但是如果\(S\)没有好的性质,也是无济于事的。但是事实证明,\(S\)是一个对角矩阵。
proof3

\[
\begin{aligned}
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 \\end{aligned}
\]
考虑对角矩阵的幂次很好求,相当于把\(\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}\)。
如下:
\[
\begin{aligned}
\sum_{j} T_{k, j} \vec v_{i, j}
& = \sum_{j = k} ^ n \frac{1}{j + 1} (-1) ^ {i + j} \binom{i}{j} \& = \sum_{j = k} ^ n \frac{1}{j + 1} (-1) ^ {i + j} \frac{i!}{j!(i - j)!} \& = \frac{1}{i + 1} \sum_{j = k} ^ n (-1) ^ {i + j} \frac{(i + 1)!}{(j + 1)!(i - j)!} \& = \frac{1}{i + 1} \sum_{j = k} ^ n (-1) ^ {i + j} \binom{i + 1}{j + 1} \& = \frac{1}{i + 1} \sum_{j = k} ^ n (-1) ^ {i + 1} \binom{j - i - 1}{j + 1} \& = \frac{(-1) ^ {i + 1}}{i + 1} \sum_{j = k} ^ n \binom{j - i - 1}{j + 1} \& = \frac{(-1) ^ {i + 1}}{i + 1} [\binom{i - i - 1 + 1}{i + 1} - \binom{k - i - 1}{k}] \& = \frac{(-1) ^ i}{i + 1} \binom{k - i - 1}{k} \& = (-1) ^ {i + k} \binom{i}{k} \& = \lambda_i v_{i, k} \\end{aligned}
\]
其中用到了杨辉三角一斜列求和和牛顿二项式定理的导出式。
杨辉三角一斜列求和:
\[
\sum_{i = l} ^ r \binom {n + i}{m + i} = \binom{n + r + 1}{m + r} - \binom{n + l}{m + l - 1}
\]
牛顿二项式定理的导出式:
\[
\binom{-n}{m} = (-1) ^ m \binom{n + m - 1}{m}
\]

proof2:
即证明:
\[
\sum_{k = 1} ^ n {P ^ {-1}}_{i, k} P_{k, j} = [i = j]
\]
又因为
\[
{P ^ {-1}}_{i, j} = \binom {j}{i} = \sum_{k = 0} ^ n [k = i] \binom{j}{k}
\]
通过二项式反演,得
\[
[j = i] = \sum_{k = 0} ^ n (-1) ^ {j - k} {P ^ {-1}}_{i, k} \binom{j}{k}
\]

\[
\begin{aligned}
\sum_{k = 1} ^ n {P ^ {-1}}_{i, k} P_{k, j}
& = \sum_{k = 1} ^ n (-1) ^ {j + k} \binom{j}{k} {P ^ {-1}}_{i, k} \& = \sum_{k = 0} ^ n (-1) ^ {j - k} \binom{j}{k} {P ^ {-1}}_{i, k} \& = [i = j]
\end{aligned}
\]

proof3:
由于
\[
\begin{aligned}
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 \text{diag}(\lambda_1, \lambda_2, \lambda_3, \ldots, \lambda_{n + 1}) \\end{aligned}
\]

\[
P ^ {-1} T P = \text{diag}(\lambda_1, \lambda_2, \lambda_3, \ldots, \lambda_{n + 1}) \\]
即\(S = P ^ {-1} T P\)是对角阵\(\text{diag}(\lambda_1, \lambda_2, \lambda_3, \ldots, \lambda_{n + 1})\)。



另附生成函数做法(图片出自_rqy‘s Blog)。

原文地址:https://www.cnblogs.com/psimonw/p/11552565.html

时间: 2024-11-02 03:45:14

[cf 947E] Perpetual Subtraction的相关文章

Codeforces 947E Perpetual Subtraction (线性代数、矩阵对角化、DP)

手动博客搬家: 本文发表于20181212 09:37:21, 原地址https://blog.csdn.net/suncongbo/article/details/84962727 呜啊怎么又是数学了啊...数学比例\(\frac{16}{33}=0.4848\) orz yhx-12243神仙 题目链接: https://codeforces.com/contest/947/problem/E 题意: 有一个\([0,n]\)的随机数\(x\)初始为\(i\)的概率为\(p_i\). \(m

CF923E Perpetual Subtraction

生成函数好题! 搬一手铃悬的题解(侵删) 现在只需要考虑怎么求出g和逆变换即可,其实也就是对函数F(x)求F(x+1)和F(x-1). 直接二项式定理展开发现是个卷积的形式,大力NTT即可. #include<bits/stdc++.h> #define N 440000 #define eps 1e-7 #define inf 1e9+7 #define db double #define ll long long #define ldb long double using namespac

【CF947E】Perpetual Subtraction

大致内容都在rqy的blog 链接 这里解释一些步骤 “搞一个生成函数”从第 3 步到第 4 步 把分母的 $x-1$ 提到 $\sum$ 外,分子的 $f_j$ 不动. 然后剩下两项很烦,考虑简化. 我们把分子的两项分开,即看作 $\frac{x^{j+1}}{j+1} - \frac{1}{j+1}$ $\frac{x^{j+1}}{j+1}$ 的导数是 $x^j$,即函数 $f(j)=\frac{x^{j+1}}{j+1}$ 的导函数是 $f(j)=x^j$. 根据牛莱公式可知,导函数在

微信 {&quot;errcode&quot;:40029,&quot;errmsg&quot;:&quot;invalid code, hints: [ req_id: Cf.y.a0389s108 ]&quot;}

{"errcode":40029,"errmsg":"invalid code, hints: [ req_id: Cf.y.a0389s108 ]"} 问题:微信网页授权后,获取到 openid 了,一刷新又没了 微信网页授权获取到的 code 只能使用一次(5分钟内有效),使用一次后,马上失效. 页面授权跳转成功,根据 code 也换取到 openid 了. 此时刷新页面,并不会再次进行授权,而是直接刷新了一下上一次授权跳转后的链接,带的还是

CF with friends and user&#39;s influence considered on NYC data(updated Aug,11st)

Here is the code link: https://github.com/FassyGit/LightFM_liu/blob/master/U_F1.py I use NYC data as other experimens. The split of the training data was seperated by the timeline, and I have normalised the interaction matrix by replacing the checkin

CF 750

今天CF打的块残废了     就是一废物 A 在24点之前到 直接模拟即可 #include<stdio.h> #include<algorithm> #include<cstring> #include<string> #include<cmath> using namespace std; #define LL long long #define MAXN 1010 #define inf 1000000000.0 int main() {

CF #394 (2) 5/6

Codeforces Round #394 (Div. 2) 总结:有毒的一场比赛.做了三题,结果A被叉,B.C挂综测,还hack失败一发,第一次在CF体会到了-50分的感觉..不知道是不是人品好,比赛时room炸了,然后,unrated.. A  水题,判一下0 0,然后abs(a-b)<=1 B  水题,组个间距比较一下,但一个数的时候要判一下 C  直接暴力上的题 D  也是xjb暴力 题意:给出n,l,r, a[], p[],另有两个数组b[], c[],ci=bi-ai.l<=ai,

一场CF的台前幕后(上)——转

前奏 大约4月份的时候,业界毒瘤pyx噔噔噔跑过来说:“酷爱!我YY了一道题!准备当CF的C” 我当时就被吓傻了."Yet another Chinese round?" “区间取模,区间求和” 感觉这题还不错?不过pyx嫌水了…… 好办!当时我刚刚出完动态仙人掌不久,于是一拍脑袋说:把这个问题出到仙人掌上去! 当然被pyx鄙视了…… 后来一直就没啥动静,直到5月底的CTSC. 试机的时候pyx给我看了套他出的神题……里面有一道题……我不小心读成了下面这个样子: “给定n个m维的模2意

[2016-03-22][CF][69A][Young Physicist]

时间:2016-03-22 19:41:34 星期二 题目编号:[2016-03-22][CF][69A][Young Physicist] 题目大意:判断向量和是否为0 分析:对应坐标相加 遇到的问题:不能用x+y+z来判断是否都为0,除非输入都是正数 #include <cstdio> using namespace std; int main(){ int a,b,c,x,y,z,n; x = y = z = 0; scanf("%d",&n); for(in