矩阵乘法最主要的作用就是用来优化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−ki−1aja[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){010000010000010...11111} \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) 这样就好啦~ 完结撒花