矩阵乘法以及矩阵快速幂
最近遇到很多有限状态机的递推计数问题,构造矩阵进行快速幂是很直观的方法。总结个模板吧。
矩阵定义:
struct mx { LL n,m; LL c[20][20];//需要根据题目开大 void initMath(LL _n)//初始化方阵 { m=n=_n; } void initOne(LL _n)//初始化单位矩阵 { m=n=_n; for(LL i=0;i<n;i++) for(LL j=0;j<m;j++) c[i][j]=(i==j); } void print()//测试打印 { for(LL i=0;i<n;i++) { for(LL j=0;j<m;j++) cout<<c[i][j]<<' '; cout<<endl; } } };
乘法:
mx Mut(mx a,mx b) { mx c; c.n=a.n,c.m=b.m; for(LL i=0;i<a.n;i++) for(LL j=0;j<b.m;j++) { LL sum=0; for(LL k=0;k<b.n;k++) sum+=a.c[i][k]*b.c[k][j],sum%=mod; c.c[i][j]=sum; } return c; }
快速幂:
mx fastMi(mx a,LL b) { mx mut;mut.initOne(a.n); while(b) { if(b%2!=0) mut=Mut(mut,a); a=Mut(a,a); b/=2; } return mut; }