【模板】矩阵加、乘、快速幂 matrix

posted on 2022-01-25 18:52:13 | under 模板 | source

typedef long long LL;
const int P=998244353;
template<int N,int M,class T=LL> struct matrix{
	T a[N+1][M+1];
	matrix(bool k=0){memset(a,0,sizeof a);for(int i=1;i<=N;i++) a[i][i]=k;}
	T* operator[](int i){return a[i];}
};
template<int N,int M,class T=LL> matrix<N,M,T> operator+(matrix<N,M,T> a,matrix<N,M,T> b){
	for(int i=1;i<=N;i++)
		for(int j=1;j<=M;j++)
			a[i][j]=(a[i][j]+b[i][j])%P;
	return a;
}
template<int N,int M,int R,class T=LL> matrix<N,R,T> operator*(matrix<N,M,T> a,matrix<M,R,T> b){
	matrix<N,R,T> r=0;
	for(int i=1;i<=N;i++)
		for(int j=1;j<=R;j++)
			for(int k=1;k<=M;k++)
				r[i][j]=(r[i][j]+a[i][k]*b[k][j])%P;
	return r;
}
template<int N,class T=LL> matrix<N,N,T> operator^(matrix<N,N,T> a,LL b){
	matrix<N,N,T> r=1;
	for(;b;b>>=1,a=a*a) if(b&1) r=r*a;
	return r;
}
struct matrix {
  int n, m;
  vector<mint> vec;
  auto operator[](int i) { return vec.begin() + i * m; }
  auto operator[](int i) const { return vec.begin() + i * m; }
  matrix() = default;
  matrix(int _n, int _m) : n(_n), m(_m), vec(_n * _m, 0) {}
};
matrix operator*(const matrix& lhs, const matrix& rhs) {
  assert(lhs.m == rhs.n);
  matrix ret(lhs.n, rhs.m);
  for (int i = 0; i < lhs.n; i++) {
    for (int j = 0; j < lhs.m; j++) {
      for (int k = 0; k < rhs.m; k++) ret[i][k] += lhs[i][j] * rhs[j][k];
    }
  }
  return ret;
}
matrix I(int n) {
  matrix ret(n, n);
  for (int i = 0; i < n; i++) ret[i][i] = 1;
  return ret;
}
posted @ 2022-11-06 19:17  caijianhong  阅读(24)  评论(0编辑  收藏  举报