我回来啦!
Description
栋栋最近迷上了随机算法,而随机数是生成随机算法的基础。栋栋准备使用线性同余法(Linear Congruential Method)来生成一个随机数列,这种方法需要设置四个非负整数参数 $m,a,c,X_0$,按照下面的公式生成出一系列随机数 ${ X_n }$
$$X_{n+1} = (aX_n + c) \bmod m$$
从这个式子可以看出,这个序列的下一个数总是由上一个数生成的。
用这种方法生成的序列具有随机序列的性质,因此这种方法被广泛地使用,包括常用的 C++ 和 Pascal 的产生随机数的库函数使用的也是这种方法。
栋栋知道这样产生的序列具有良好的随机性,不过心急的他仍然想尽快知道 $X_n$是多少。由于栋栋需要的随机数是$0,1,\dots,g-1$之间的,他需要将 $X_n$除以 $g$取余得到他想要的数,即 $X_n \bmod g$,你只需要告诉栋栋他想要的数 $X_n \bmod g$是多少就可以了.
Samples
Input #1
1 | 11 8 7 1 5 3 |
Output #1
1 | 2 |
Solution
题目中给出了一个递推式,那么考虑通过矩阵快速幂来求.
首先我们设$\rm {A}$表示初始矩阵,$\rm {B}$表示转移矩阵, 那么最后的答案矩阵应该是$\rm {A \times B^n}$.
那么根据矩阵快速幂的套路,我们设出矩阵$\rm {A,B}$的每一个元素,然后根据题目中的递推式列出式子.
我的博客渲染好像对于大括号和矩阵出了点问题,暂且先放个图片吧qaq
容易发现,根据方程组得出的两组解都是成立的,那么我们随便选取一种作为初始/转移矩阵即可啦
Code
这里的代码选取了上面推导过程中的第一个根.
1 | /* Headers */ |