矩阵运算模板

struct info{
	int n,m,A[N][N];
	info(int a,int b):n(a),m(b){memset(A,0,sizeof(A));}
	int *operator [](int x){return A[x];}
	friend info operator *(info a,info b){
		info c(a.n,b.m);
		for(int i=0;i<c.n;++i)
			for(int j=0;j<c.m;++j)
				for(int k=0;k<a.m;++k)
					c[i][j]=(c[i][j]+1ll*a[i][k]*b[k][j]%mo)%mo;
		return c;
	}
	
	void print(){
		for(int i=0;i<n;++i,puts(""))
			for(int j=0;j<m;++j)
				printf("%d ",A[i][j]);
		puts("");
	}
};

info Pow(info A,int c){
    info res(A.n,A.m);
    for(int i=0;i<res.n;++i) res[i][i]=1;
    for(;c;c>>=1,A=A*A) if(c&1) res=res*A;
    return res;
}

 

posted @ 2018-05-04 09:14  void_f  阅读(131)  评论(0编辑  收藏  举报