链接
题意
A是一个方阵,\(Tr\space A\)表示\(A\)的迹(即是主对角线上的和),现在要求\(Tr(A^k)\%9973\)
输入格式:第一行为\(t\),共\(t\)组测试样例,每组数据的一行两个数字\(n,k\),接下来\(n\)行\(n\)列,表示方阵\(A\)
输出格式:每组测试样例一行输出,输出\(Tr(A^k)\%9973\)
数据范围:\(2\leq n\leq 10,2\leq k\leq 10^9\)
分析
这是一个矩阵快速幂的模板题;
对于\(\text{Successione di Fibonacci}\),有:
- \(f_{0}=0\)
- \(f_{1}=1\)
- \(f_{n}=f_{n-1}+f_{n-2}(n≧2)\)
如果需要我们求出\(f_{1e9}\%(1e9+7)\)的结果,那么我们直接利用递推公式进行求解,显然是不可行的。
定义\(F(n)=\begin{bmatrix} f_{n} & f_{n+1} \end{bmatrix}\),且\(f_0=0,f_1=1,f_{n}=f_{n-1}+f_{n-2}(n≧2)\),我们有:
\[ F(n)=\begin{bmatrix} f_{n} & f_{n+1}\end{bmatrix} = \begin{bmatrix} f_{n-1} & f_{n}\end{bmatrix}* \begin{bmatrix}0&1\\ 1 & 1\end{bmatrix}=\vdots=\begin{bmatrix} f_{0} & f_{1}\end{bmatrix}*\begin{bmatrix}0&1\\ 1 & 1\end{bmatrix}^{n}\]
令\(A=\begin{bmatrix}0&1\\ 1 & 1\end{bmatrix}\),则有\(F(n)=F(0)*A^{n}\),实际上我们只要考虑求解\(A^n\)即可,如果这里的\(A\)是一个整数,那么我们直接快速幂即可,但是这里是一个矩阵。
这里有涉及到广义快速幂的概念;
\((G,*)\)是一个群(\(1.*\)在\(G\)上的运算是封闭的;\(2.\)满足交换律;\(3.\)对\(G\)中的任意元素含有唯一的单位元;\(4.\)除零元外均有逆元),\(*\)是一种二元运算(泛指),\(e\)为\(*\)在\(G\)上的单位元,\(a\in G\),\(e*a=a*e=a\),\((a^{-1})^{-1}=a\),规定\(a^{0}=1,a^{-n}=(a^{n})^{-1}\),可以证明\(a^{m}\cdot a^{n}=a^{m+n}\),\((a^{m})^{n}=a^{mn}\),那么关于它的快速幂可以这样写:
1 | typename pow(typename a, int n) { |
对于上面的\(A^n\),那么\((G,*)\)是一个群,\(*\)为矩阵乘法,\(G\)元素为\(e、A、A^{2}、A^{3}\dots A^{\infty}\),并且\(A\)是一个方阵,那么广义快速幂对于它来说也是成立的,注意\(A\)的单位元是单位矩阵。
代码
1 |
|