Description
当 $x \geq 4$ 时,$f_x = c^{2x - 6} \cdot f_{x - 1} \cdot f_{x - 2} \cdot f_{x - 3}$ 。
现在已知 $n,f_1,f_2,f_3,c$ 的值,求 $f_n$ 的值,对 $10^9 + 7$ 取模。
$(4 \leq n \leq 10^{18},1 \leq f_1,f_2,f_3,c \leq 10^9)$
Source
Solution
一道比较有思维难度的 矩阵加速 。
一般情况下转移都是加法,而这道题是乘法,所以考虑转换。
我们可以先列举出前几个数。同底数幂相乘,底数不变,指数相加。
$f_1 = c^0 \cdot f_1^1 \cdot f_2^0 \cdot f_3^0$
$f_2 = c^0 \cdot f_1^0 \cdot f_2^1 \cdot f_3^0$
$f_3 = c^0 \cdot f_1^0 \cdot f_2^0 \cdot f_3^1$
$f_4 = c^2 \cdot f_1^1 \cdot f_2^1 \cdot f_3^1$
$f_5 = c^6 \cdot f_1^1 \cdot f_2^2 \cdot f_3^2$
$f_6 = c^{14} \cdot f_1^2 \cdot f_2^3 \cdot f_3^4$
$f_7 = c^{30} \cdot f_1^4 \cdot f_2^6 \cdot f_3^7$
$\cdots\cdots$
不难发现对于每一个 $f_i$,我们都可以表示为
$w_i,x_i,y_i,z_i$ 的递推方程也可以写出。
$w_i = w_{i - 1} + w_{i - 2} + w_{i - 3} + 2i - 6$
$x_i = x_{i - 1} + x_{i - 2} + x_{i - 3}$
$y_i = y_{i - 1} + y_{i - 2} + y_{i - 3}$
$z_i = z_{i - 1} + z_{i - 2} + z_{i - 3}$
我们可以先用 矩阵加速 分别求出 $4$ 个指数 $w_n,x_n,y_n,z_n$ 的值,再用快速幂求得 $f_n$ 。
对于 $x,y,z$ 数组,因为转移方程相同,所以转移矩阵也相同。这里以 $x$ 为例。
因为 $x_i = x_{i - 1} + x_{i - 2} + x_{i - 3}$,所以矩阵第一行全部是 $1$ 。$x_{i - 1},x_{i - 2}$ 都可以在上一个矩阵中找到,对应位置标为 $1$ 。
初始矩阵:
通过 $f_1,f_2,f_3$ 得到。
答案矩阵:
$x_n,y_n,z_n$ 都是取矩阵第一行第一列的值。
$w$ 数组就稍微麻烦一些了,因为多了一项 $2i - 6$ 。
因为 $w_i = w_{i - 1} + w_{i - 2} + w_{i - 3} + 2(i - 1) - 6 + 2$,所以第一行全部是 $1$ 。$w_{i - 1},w_{i - 2}$ 可以在上一个矩阵中找到,对应位置标为 $1$ 。$2i - 6 = 2(i - 1) - 6 + 2$,所以第四列和第五列为 $1$ 。对于 $2 = 2$,把第五列标为 $1$ 。
初始矩阵:
可以直接得出。
答案矩阵:
$w_n$ 也同样取矩阵第一行第一列的值。
最后的结果要对 $10^9 + 7$ 取模,但是在做 矩阵加速 的过程中,指数肯定不能直接对它取模。这里要用到 扩展欧拉定理:
若 $a,p$ 互质,则
因为 $p$ 是质数,所以 $a,p$ 一定互质。我们可以将指数对 $\varphi(p) = p - 1 = 10^9 + 6$ 取模,就能达到降幂的效果。
分别求出 $w_n,x_n,y_n,z_n$,最后用快速幂合并答案得到 $f_n$ 。时间复杂度为 $O(\log n)$ 。
Code
1 |
|