矩阵乘法最主要的作用就是用来优化dp了,对于一些求前n-k项和的操作,可以用矩阵乘法快速幂解决
矩乘代码
struct mat
{
long long a[105][105];
mat operator *(const mat &x)const
{
mat f;
for(int i=0;i<K;i++)
for(int j=0;j<K;j++)
{
f.a[i][j]=0ll;
for(int k=0;k<K;k++)
f.a[i][j]=(f.a[i][j]+a[i][k]*x.a[k][j])%mod;
}
return f;
}
}
最好写成重载运算符的形式,要不然很难看
然后对于一些数
a
[
i
]
=
∑
j
=
i
−
k
i
−
1
a
j
a[i]=\sum^{i-1}_{j=i-k}a_{j}
a[i]=∑j=i−ki−1aj
我们可以构造两个矩阵
(2)
{
a
[
i
−
k
]
a
[
i
−
k
+
1
]
.
.
.
a
[
i
−
2
]
a
[
i
−
1
]
}
\left\{ \begin{matrix} a[i-k] \\ a[i-k+1] \\ ... \\ a[i-2]\\ a[i-1]\\ \end{matrix} \right\} \tag{2}
⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧a[i−k]a[i−k+1]...a[i−2]a[i−1]⎭⎪⎪⎪⎪⎬⎪⎪⎪⎪⎫(2)
(2)
{
0
1
0
0
0
0
0
1
0
0
0
0
0
1
0
.
.
.
1
1
1
1
1
}
\left\{ \begin{matrix} 0 & 1 & 0 & 0 &0 \\ 0 & 0 & 1 &0&0\\ 0 & 0 & 0&1&0\\ ...\\ 1 &1 &1 &1 &1 \end{matrix} \right\} \tag{2}
⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧000...11001010100110001⎭⎪⎪⎪⎪⎬⎪⎪⎪⎪⎫(2)
这样就好啦~
完结撒花