Loading

P2044 随机数生成器 题解

这么标准的不动点居然只有一篇不动点题解?

而且唯一的不动点题解关于不动点的描述还是错的?

所以,来写一篇题解讲讲,MO 中是怎么弄这种一阶线性递推式的。

单个数,虽然省常数,却难以取膜。


让我们对形如 \(x_{n+1} = f(x_n)\) 的式子求出通项,其中 \(f(x_n)\) 是一个关于 \(x_n\) 的一次函数。

左右两边都是一次的,但是一次项的系数有差距。所以我们可以知道这东西到后面是以指数增长的。

如果这样的式子是 \(x_{n+1} = k \cdot x_n\) 的,我们就能立刻知道 \(x_{n+1} = k^n \cdot x_1\)。换而言之,重要的是消除常数项在递推中的影响,这可以通过换元实现。

尝试以 \(x-c\)\(x\),使得 \(x'_{n+1} = k \cdot x'_n\)

写开,

\[\begin{aligned} x_{n+1} - c &=& k \cdot x_n - c \cdot k \\ x_{n+1} &=& k \cdot x_n + c \cdot (1-k) \end{aligned} \]

若原递推式为 \(x_{n+1} = a \cdot x_n + b\),对比系数知 \(k = a, c = \dfrac{b}{1-a}\)。于是我们就有 \(x_{n+1} - \dfrac{b}{1-a} = a \cdot (x_n - \dfrac{b}{1-a})\)。这是一个漂亮的结果,借助它,我们能进行快速幂运算。

这里我们求出的 \(c\) 叫不动点,意义很简单:使 \(f(c) = c\) 的点,在迭代中不动的点。熟知 \(x-t\) 整除 \(f(x)\) 等价于 \(f(t)=0\)。我们能发现 \(f(x)-c=x-c\),此时 \(f(x)-c\) 含有 \(x-c\) 这个因式,所以一边出现了 \(x_{n+1}-c\),一边出现了 \(x_n-c\)

这里的不动点,用处就是平移图像以消去常数项。

代码难写处在于 \(a-1\) 不一定有逆元,这个的处理方式 这篇题解 的最后有提到。需要提起的是,这篇题解关于不动点的定义是错误的,这也是我写这篇题解的意义。

posted @ 2022-09-26 22:35  purplevine  阅读(61)  评论(0编辑  收藏  举报