Mat operator + (Mat b) { int i, j; Mat c; c.sz = sz; c.clr(); for (i = 0; i < sz; i++) for (j = 0; j < sz; j++) c.mat[i][j] = ((LL) mat[i][j] + b.mat[i][j]) % MOD; return c; }
Mat operator - (Mat b) { int i, j; Mat c; c.sz = sz; c.clr(); for (i = 0; i < N; i++) { for (j = 0; j < N; j++) c.mat[i][j] = mat[i][j] - b.mat[i][j]; } return c; }
Mat operator * (Mat b) { int i, j, k; Mat c; c.sz = sz; c.clr(); for (i = 0; i < sz; i++) { for (k = 0; k < sz; k++) { if (mat[i][k] == 0) continue; for (j = 0; j < sz; j++) { if( b.mat[k][j] == 0) continue; c.mat[i][j] = ((LL) mat[i][k] * b.mat[k][j] + c.mat[i][j]) % MOD; } } } return c; }