Zth's Blog

记录学习路上的点滴

0%

51nod1836.战忽局的手段

题目链接

题意

众所周知,有一个神秘的组织——战忽局,在暗中保护着我们。在局中任职的官员都有着极强的忽悠技巧,不只能用预言,还能用往事忽悠人。如今某外星间谍已经获得了战忽局曾经参与的$n$次事件的资料,局座发现了这件事,于是决定再次用忽悠来保证战忽局的安全。局座将发表$m$次演讲,每一天他都会从$n$事件中等概率地挑选一件混淆众人,由于局座每天很忙,不能把之前将的事件都记录下来,因此他可能会重复选择某一件事。现在局座想知道,$m$次演讲过后,期望能使多少事件混淆众人。

输入输出和数据范围

第一行一个正整数$T(1 \leq T \leq 1000)$, 表示数据组数。 接下来$T$行每行两个正整数$n, m(1 \leq n, m \leq 10^{18})$

每组数据输出一个实数$ans$, 与标准答案误差不超过$10^{-6}$即视为正确

题解

由题面数据范围不难看出这次采用的应该是$O(log)$的算法, 那我第一感觉是快速幂(这题解法可以说是快速幂但又完全不是)

既然是期望$dp$, 那我们就按照常规的方法设$dp$数组, 之后再尝试化简合并

设$dp[i][j]$表示局座演讲了$i$次, 使$j$个事件混淆众人的概率

显然对$i > 0, j > 0$有

另设$g[i]$表示$n = i$时的答案(方便一会合并用)

接下来我们开始化简

上式的前半部分, 当$j = 0$和$j = i$时$f[i - 1][j] \times \frac{j ^ 2}{n}$显然为零, 添加或减少这两项对和式的值没有影响

后半部分,对$j$进行抖动

我们就得到了

一旦$n$确定了, $\frac{n - 1}{n}$就变成了一个常数, 那么这个递推式就可以写成矩阵乘法的形式了!

显然我们的转移矩阵需要两维

初始矩阵为

转移矩阵为

但是题解说由于$\frac{n - 1}{n}$是实数, 精度损失会很大, 大概只能有$10^{-2}, 10^{-3}$的样子, 所以要使用高精度