矩阵快速
:由于矩阵乘法具有结合律,因此对于矩阵A,有A^4 = A * A * A * A = (A*A) * (A*A) = A^2 * A^2。我们可以得到这样的结论:当n为偶数时,A^n = A^(n/2) * A^(n/2);当n为奇数时,A^n = A^(n/2) * A^(n/2) * A (其中n/2取整)。
递归:
struct martrix
{
int m[maxn][maxn];
};
martrix mtmul(martrix a,martrix b)
{
martrix c;
int i,j,k;
for(i =
0; i < n; i++)
{
for(j =
0; j < n;j++)
{
c.m[i][j] =
0;
for(k =
0 ; k < n;k++)
{
c.m[i][j] += a.m[i][k] * b.m[k][j];
c.m[i][j] %=mod;
}
}
}
return c;
}
优化的乘法
1
/*
matrix mtmul(matrix a,matrix b)
2
{
3
int i,j,k;
4
matrix c;
5
c.clear();
6
for(i =0 ; i <= n;i++)
7
{
8
for(k = 0; k <=n;k++)
9
{
10
11
if(a.m[i][k])//优化
12
for(j = 0 ; j <=n;j++)
13
{
14
c.m[i][j] += a.m[i][k]*b.m[k][j];
15
16
}
17
}
18
}
19
return c;
20
}
*/
martrix mtpow(martrix d,int k)
{ martrix a;
if(k == 1) return d;
int mid = k / 2;
a = mtpow(d,k/2);
a = mtmul(a,a);
if(k & 1)
{
a = mtmul(a,d);
}
return a;
}
非递归:
e.m[i][i] = 1 ;
martrix mtpow(martrix d,
int k)
{ martrix a;
a = e;
//
e 为单位矩阵
while(k)
{
if(k&
1)
{
a = mtmul(a,d);
}
k/=
2;
d = mtmul(d,d);
}
return a;
}