struct Matrix {
static const int MOD = 1e9 + 7;
static const int MAXK = 400 + 10;
int k, A[MAXK][MAXK];
void Init(int k) {
this->k = k;
memset(A, 0, sizeof(A));
}
Matrix operator+(const Matrix &ma)const {
Matrix res;
res.Init(k);
for(int i = 1; i <= k; ++i) {
for(int j = 1; j <= k; ++j) {
res.A[i][j] = A[i][j] + ma.A[i][j];
if(res.A[i][j] >= MOD)
res.A[i][j] -= MOD;
}
}
return res;
}
Matrix operator-(const Matrix &ma)const {
Matrix res;
res.Init(k);
for(int i = 1; i <= k; ++i) {
for(int j = 1; j <= k; ++j) {
res.A[i][j] = A[i][j] - ma.A[i][j];
if(res.A[i][j] < 0)
res.A[i][j] += MOD;
}
}
return res;
}
Matrix operator*(const Matrix &ma)const {
Matrix res;
res.Init(k);
for(int i = 1; i <= k; ++i) {
for(int t = 1; t <= k; ++t) {
for(int j = 1, T = A[i][t]; j <= k; ++j) {
res.A[i][j] += 1LL * T * ma.A[t][j] % MOD;
if(res.A[i][j] >= MOD)
res.A[i][j] -= MOD;
}
}
}
return res;
}
Matrix pow(ll n)const {
Matrix res, x;
res.Init(k), x.Init(k);
for(int i = 1; i <= k; ++i) {
res.A[i][i] = 1;
for(int j = 1; j <= k; ++j)
x.A[i][j] = A[i][j];
}
while(n) {
if(n & 1)
res = res * x;
x = x * x;
n >>= 1;
}
return res;
}
void Show() {
for(int i = 1; i <= k; ++i) {
for(int j = 1; j <= k; ++j)
printf("%d%c", A[i][j], "
"[j == k]);
}
}
};
MAXK=400可以放进Windows的栈中,MAXK更大的话,就要写成静态的形式了,否则可能会出现RE的情况。