首先,复习一下矩阵运算,运算为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效果还是一样的。