矩阵相乘与矩阵快速幂
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
|
#define CLR(arr,val) memset(arr,val,sizeof(arr))
const
int
MAX=100;
struct
Matrix;
int
mod=1000007;
struct
Matrix
{
Matrix(){}
void
init(
int
r,
int
c)
//初始为全零矩阵
{
row=r;col=c;CLR(data,0);
}
void
init(
int
size)
//初始为单位矩阵
{
row=size;col=size;CLR(data,0);
for
(
int
i=0;i!=size;i++) data[i][i]=1;
}
int
data[MAX][MAX];
int
row,col;
const
Matrix&
pow
(
int
m);
};
Matrix ret,temp,pret;
const
Matrix& operator*(
const
Matrix& m1,
const
Matrix &m2)
{
ret.init(m1.row,m2.col);
for
(
int
i=0;i!=m1.row;i++)
for
(
int
j=0;j!=m1.col;j++)
if
(m1.data[i][j])
for
(
int
k=0;k!=m2.col;k++)
if
(m2.data[j][k]) ret.data[i][k]=(ret.data[i][k]+((
long
long
)m1.data[i][j]*m2.data[j][k]))%mod;
return
ret;
}
const
Matrix& Matrix::
pow
(
int
m)
{
temp=*
this
;
pret.init(row);
while
(m)
{
if
(m&1)
pret=temp*pret;
temp=temp*temp;
m>>=1;
}
return
pret;
}
|
该文章为acmol所有,转载请指明出处:http://blog.acmol.com