首先,复习一下矩阵运算,运算为c[x,y]:=a[x,i]*b[i,y],也就是说答案矩阵的第 i行第j个数就是a矩阵第i行所有数与b矩阵第j列所有数一一对应相乘的和。

实现为程序语言:

function mul(a,b:matrix; l,m,n,modnum:int64):matrix;
var
  c:matrix;
begin
  fillchar(c,sizeof(c),0);
  for i:=1 to l do
    for j:=1 to m do
      for k:=1 to n do
      inc(c[i,j],((a[i,k]mod modnum)*(b[k,j] mod modnum)mod modnum));
  exit(c);
end;

      清楚了构造,复习的时候还是很容易看懂自己以前的程序的,然后就是矩阵的快速幂乘法了,只有二分了之后,矩阵才起到了优化的效果: 

function power(a:matrix; l,m,n,x,modnum:int64):matrix;
var
  i,j,k:longint;
begin
  if x=1 then exit(a);
  power:=power(a,l,m,n,x shr 1,modnum);
  power:=mul(power,power,l,m,n,modnum);
  if x and 1=1 then power:=mul(power,a,l,m,n,modnum);
end;

      至于矩阵的创立,主要就是靠观察的吧,相比来说,比Dp简单多了,只要吧两个矩阵列出来,还是比较容易找出其关系式的,然后就建立矩阵了,此外,矩阵优化的矩阵一般都是N*N的,这样比较方便,如果不是,在外面加几排0效果还是一样的。

愿你出走半生,归来仍是少年