题意
现在有个正整数(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 =
egin{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
eq vec 0, T vec v = lambda vec v)的(lambda),其充要条件是(|T - lambda I| = 0)。
由于
[|T - lambda I|
=
left |
egin{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}
ight |
=
left |
egin{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}
ight |
=
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
eq vec 0, T vec v = lambda vec v)的(vec v)。
尝试进行小范围的模拟计算,可以得出结果:
满足(T vec v_i = frac{1}{i} vec v_i)的(vec v_i)为
[egin{bmatrix}
(-1) ^ {i - 1} inom{i - 1}{0} \
(-1) ^ {i} inom{i - 1}{1} \
ldots \
(-1) ^ {i + i - 2} inom{i - 1}{i - 1} \
0 \
ldots \
0 \
end{bmatrix}
]
proof1
则
[P =
egin{bmatrix}
1 & -1 & 1 & ldots & (-1) ^ n inom{n}{0} \
0 & 1 & -2 & ldots & (-1) ^ {n + 1} inom{n}{1} \
0 & 0 & 1 & ldots & (-1) ^ {n + 2} inom{n}{2} \
ldots & ldots & ldots & ddots & ldots \
0 & 0 & 0 & ldots & (-1) ^ {n + n} inom{n}{n} \
end{bmatrix}
]
而
[P ^ {-1} =
egin{bmatrix}
1 & 1 & 1 & ldots & inom{n}{0} \
0 & 1 & 2 & ldots & inom{n}{1} \
0 & 0 & 1 & ldots & inom{n}{2} \
ldots & ldots & ldots & ddots & ldots \
0 & 0 & 0 & ldots & inom{n}{n} \
end{bmatrix}
]
proof2
又因为(S = P T P ^ {-1})即(T = P ^ {-1} S P)。有了(P),(S)能用几次多项式卷积快速计算出。
但是如果(S)没有好的性质,也是无济于事的。但是事实证明,(S)是一个对角矩阵。
proof3
则
[egin{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})。
如下:
[egin{aligned}
sum_{j} T_{k, j} vec v_{i, j}
& = sum_{j = k} ^ n frac{1}{j + 1} (-1) ^ {i + j} inom{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} inom{i + 1}{j + 1} \
& = frac{1}{i + 1} sum_{j = k} ^ n (-1) ^ {i + 1} inom{j - i - 1}{j + 1} \
& = frac{(-1) ^ {i + 1}}{i + 1} sum_{j = k} ^ n inom{j - i - 1}{j + 1} \
& = frac{(-1) ^ {i + 1}}{i + 1} [inom{i - i - 1 + 1}{i + 1} - inom{k - i - 1}{k}] \
& = frac{(-1) ^ i}{i + 1} inom{k - i - 1}{k} \
& = (-1) ^ {i + k} inom{i}{k} \
& = lambda_i v_{i, k} \
end{aligned}
]
其中用到了杨辉三角一斜列求和和牛顿二项式定理的导出式。
杨辉三角一斜列求和:
[sum_{i = l} ^ r inom {n + i}{m + i} = inom{n + r + 1}{m + r} - inom{n + l}{m + l - 1}
]
牛顿二项式定理的导出式:
[inom{-n}{m} = (-1) ^ m inom{n + m - 1}{m}
]
proof2:
即证明:
[sum_{k = 1} ^ n {P ^ {-1}}_{i, k} P_{k, j} = [i = j]
]
又因为
[{P ^ {-1}}_{i, j} = inom {j}{i} = sum_{k = 0} ^ n [k = i] inom{j}{k}
]
通过二项式反演,得
[[j = i] = sum_{k = 0} ^ n (-1) ^ {j - k} {P ^ {-1}}_{i, k} inom{j}{k}
]
则
[egin{aligned}
sum_{k = 1} ^ n {P ^ {-1}}_{i, k} P_{k, j}
& = sum_{k = 1} ^ n (-1) ^ {j + k} inom{j}{k} {P ^ {-1}}_{i, k} \
& = sum_{k = 0} ^ n (-1) ^ {j - k} inom{j}{k} {P ^ {-1}}_{i, k} \
& = [i = j]
end{aligned}
]
proof3:
由于
[egin{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 ext{diag}(lambda_1, lambda_2, lambda_3, ldots, lambda_{n + 1}) \
end{aligned}
]
则
[P ^ {-1} T P = ext{diag}(lambda_1, lambda_2, lambda_3, ldots, lambda_{n + 1}) \
]
即(S = P ^ {-1} T P)是对角阵( ext{diag}(lambda_1, lambda_2, lambda_3, ldots, lambda_{n + 1}))。
另附生成函数做法(图片出自_rqy's Blog
)。