Matrix Operation

struct matrix { int n; vector<vector<int> > t; matrix() { } matrix(int _n, int val) {n = _n; t.assign(n, vector<int>(n, val)); } matrix(int _n) {n = _n; t.assign(n, vector<int>(n, 0)); } matrix(vector<vi> v){n=v.size();t=v;} matrix unit(int _n) { matrix ans=matrix(_n,0); for(int i=0;i<_n;i++) ans.t[i][i]=1; return ans; } ///make sure to erase mod if not needed matrix operator * (matrix b) { matrix c = matrix(n, 0); for(int i = 0; i < n; i++) for(int k = 0; k < n; k++) for(int j = 0; j < n; j++) c.t[i][j] = (c.t[i][j] + 1LL*t[i][k] * b.t[k][j]%mod) % mod; return c; } matrix operator | (matrix b) { matrix c = matrix(n, -inf); for(int i = 0; i < n; i++) for(int k = 0; k < n; k++) for(int j = 0; j < n; j++) c.t[i][j] = max(c.t[i][j], t[i][k] + b.t[k][j]); return c; } matrix pow(ll k) { if(k==0) return unit(n); k--; matrix a=*this,ans=a; while(k){ if(k&1) ans=ans*a; a=a*a; k>>=1; } return ans; } matrix pow_max(ll k) { if(k==0) return unit(n); k--; matrix a=*this,ans=a; while(k){ if(k&1) ans=ans|a; a=a|a; k>>=1; } return ans; } matrix operator + (matrix a) { matrix ans=matrix(n,n); for(int i=0;i<n;i++) for(int j=0;j<n;j++) ans.t[i][j]=t[i][j]+a.t[i][j]; return ans; } matrix operator - (matrix a) { matrix ans=matrix(n,n); for(int i=0;i<n;i++) for(int j=0;j<n;j++) ans.t[i][j]=t[i][j]-a.t[i][j]; return ans; } bool operator == (const matrix& a) { return t==a.t; } bool operator != (const matrix& a) { return t!=a.t; } void print() { for(int i=0;i<n;i++) for(int j=0;j<n;j++) cout<<t[i][j]<<" \n"[j==n-1]; } };

Comments

Popular posts from this blog

C++ STL practice problem link

Binary Index Tree(BIT)

Combinatorics