算法专题
基础?递推
斐波那契, F 0 = 1 , F 1 = 1 , F n = F n − 2 + F n − 1 ( n ≥ 2 ) F_0=1,F_1=1,F_n=F_{n-2}+F_{n-1}(n\geq 2) F0=1,F1=1,Fn=Fn−2+Fn−1(n≥2)
所以通过 O ( n ) O(n) O(n)解出
矩阵乘法
C i , j = ∑ A i , k × B k , j C_{i,j}=\sum A_{i,k}\times B_{k,j} Ci,j=∑Ai,k×Bk,j
矩阵乘法是具有结合律的,所以通过这个特点可以用到快速幂。
- 状态矩阵,长度为 n n n的一维向量
- 转移矩阵,与状态矩阵相乘的矩阵
洛谷 1962 斐波那契数列
分析
容易可得,状态矩阵就是 [ F n − 1 F n ] \left[\begin{matrix}F_{n-1}&F_n\end{matrix}\right] [Fn−1Fn]
根据斐波那契数列,可以得到
[ 0 1 1 1 ] \left[\begin{matrix}0&1\\1&1\end{matrix}\right] [0111]
显然,对于 F n − 1 F_{n-1} Fn−1在下一时刻会给 F n F_{n} Fn,而 F n F_{n} Fn会结合 F n − 1 F_{n-1} Fn−1在下一时刻变成 F n + 1 F_{n+1} Fn+1,所以得到了这个转移矩阵
那么 F n = F 0 × [ 0 1 1 1 ] n F_{n}=F_{0}\times \left[\begin{matrix}0&1\\1&1\end{matrix}\right]^n Fn=F0×[0111]n
代码太丑,就不贴了
HDU 5015 233 Matrix
题目
给定 a 1 , 0 , a 2 , 0 , … , a n , 0 a_{1,0},a_{2,0},\dots,a_{n,0} a1,0,a2,0,…,an,0,然后 a 0 , 0 = 0 , a 0 , 1 = 233 , a 0 , 2 = 2333 , … a_{0,0}=0,a_{0,1}=233,a_{0,2}=2333,\dots a0,0=0,a0,1=233,a0,2=2333,…,规定 a i , j = a i − 1 , j + a i , j − 1 a_{i,j}=a_{i-1,j}+a_{i,j-1} ai,j=ai−1,j+ai,j−1
问 a n , m   m o d   10000007 a_{n,m} \bmod 10000007 an,mmod10000007
分析
首先想要维护前缀和,但是233怎么办,可以假使 a 0 , 0 = 23 a_{0,0}=23 a0,0=23,那么之后也就是 a 0 , i = a 0 , i − 1 × 10 + 3 a_{0,i}=a_{0,i-1}\times 10+3 a0,i=a0,i−1×10+3
那么状态矩阵是
[ 23 a 1 , 0 a 2 , 0 3 ] \left[ \begin{matrix} 23&a_{1,0}&a_{2,0}&3 \end{matrix} \right] [23a1,0a2,03]
想到转移矩阵是
[ 10 0 0 1 10 1 0 1 10 1 1 1 0 0 0 1 ] \left[ \begin{matrix} 10&0&0&1\\ 10&1&0&1\\ 10&1&1&1\\ 0&0&0&1 \end{matrix} \right] ⎣⎢⎢⎡1010100011000101111⎦⎥⎥⎤
所以
F m = F 0 × [ 10 0 0 1 10 1 0 1 10 1 1 1 0 0 0 1 ] m F_{m}=F_{0}\times \left[\begin{matrix}10&0&0&1\\10&1&0&1\\10&1&1&1\\0&0&0&1\end{matrix}\right]^m Fm=