矩阵快速幂求斐波那契数列
( F i b o n a c c i [ i ] F i b o n a c c i [ i − 1 ] ) ¥ ( 1 1 1 0 ) ∗ ( F i b o n a c c i [ i − 1 ] F i b o n a c c i [ i − 2 ] ) ¥ 有 递 推 关 系 可 得 ¥ ( F i b o n a c c i [ i ] F i b o n a c c i [ i − 1 ] ) ¥ ( 1 1 1 0 ) i − 1 ∗ ( F i b o n a c c i [ 1 ] F i b o n a c c i [ 2 ] ) \left( \begin{array}{l} & Fibonacci[i] &\\ & Fibonacci[i-1] & \end{array} \right) ¥ \left( \begin{array}{l} & 1 & 1 &\\ & 1 & 0 & \end{array} \right) * \left( \begin{array}{l} & Fibonacci[i-1] &\\ & Fibonacci[i-2] & \end{array} \right) ¥ 有递推关系可得 ¥ \left( \begin{array}{l} & Fibonacci[i] &\\ & Fibonacci[i-1] & \end{array} \right) ¥ \left( \begin{array}{l} & 1 & 1 &\\ & 1 & 0 & \end{array} \right)^{i-1} * \left( \begin{array}{l} & Fibonacci[1] &\\ & Fibonacci[2] & \end{array} \right) (Fibonacci[i]Fibonacci[i−1])¥(1110)∗(Fibonacci[i−1]Fibonacci[i−2])¥有递推关系可得¥(Fibonacci[i]Fibonacci[i−1])¥(1110)i−1∗(Fibonacci[1]Fibonacci[2])
此时需要求矩阵的快速幂
回顾一下
快速幂
考虑取模 ( a ∗ b ) (a*b)%c (a∗b)= ( ( a ((a ((a% c ) ∗ ( b c)*(b c)∗(b% c ) ) c)) c))% c c c
int power(int a, int n)
{
int res = 1;
while(n)
{
if(n & 1)
{
res *= a;
res %= mod;
}
a *= a;
a %= mod;
n >>= 1;
}
return res % mod;
}
矩阵快速幂(区别只是将底数换成了矩阵)
int n,mod;
int temp[N][N]; // 辅助数组
int res[N][N],a[N][N];
void mul(int a[][N], int b[][N])
{
memset(temp,0,sizeof(temp));
for(int i = 0;i < N;i++) // 矩阵乘法
{
for(int j = 0;j < N;j++)
{
for(int k = 0;k < N;k++)
{
temp[i][j] += a[i][k]*b[k][j];
}
}
}
for(int i = 0;i < N;i++) // 结果复制到a数组中
{
for(int j = 0;j < N;j++)
{
a[i][j] = temp[i][j];
}
}
}
void fun(int n)
{
memset(res,0,sizeof(res));
for(int i = 0;i < N;i++)
{
res[i][i] = 1;
}
while(n)
{
if(n & 1)
{
mul(res,a);
}
mul(a,a);
m >>= 1;
}
}
常见递推式:
①
f
[
n
]
=
a
f
[
n
−
1
]
+
b
[
f
−
2
]
+
c
f[n] = af[n-1]+b[f-2]+c
f[n]=af[n−1]+b[f−2]+c
(
F
[
i
]
F
[
i
−
1
]
C
)
¥
(
a
b
1
1
0
0
0
0
1
)
∗
(
F
[
i
−
1
]
F
[
i
−
2
]
C
)
\left( \begin{array}{l} & F[i] &\\ & F[i-1] & \\ & C & \\ \end{array} \right) ¥ \left( \begin{array}{l} & a & b & 1 &\\ & 1 & 0 & 0 &\\ & 0 & 0 & 1& \end{array} \right) * \left( \begin{array}{l} & F[i-1] &\\ & F[i-2] &\\ & C & \end{array} \right)
⎝⎛F[i]F[i−1]C⎠⎞¥⎝⎛a10b00101⎠⎞∗⎝⎛F[i−1]F[i−2]C⎠⎞
②
f
[
n
]
=
c
n
−
f
[
n
−
1
]
f[n] = c^n-f[n-1]
f[n]=cn−f[n−1]
(
F
[
i
]
c
n
)
¥
(
−
1
c
0
c
)
∗
(
F
[
i
−
1
]
c
i
−
1
)
\left( \begin{array}{l} & F[i] &\\ & c^n & \end{array} \right) ¥ \left( \begin{array}{l} & -1 & c &\\ & 0 & c & \end{array} \right) * \left( \begin{array}{l} & F[i-1] &\\ & c^{i-1} & \end{array} \right)
(F[i]cn)¥(−10cc)∗(F[i−1]ci−1)