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
Post a Comment