typedef long long ll;
ll mod = 1e9 + 7;
const int maxn = 10;
struct Matrix
{
long long a[maxn][maxn];
int n, m;
Matrix(int n, int m)
{
memset(a, 0, sizeof(a));
this->n = n;
this->m = m;
}
static Matrix build(int n)
{
Matrix matrix(n, n);
for (int i = 0; i < n; i++)
{
matrix.a[i][i] = 1;
}
return matrix;
}
Matrix operator*(const Matrix &c)
{
Matrix mul(n, c.m);
for (int i = 0; i < n; i++)
{
for (int k = 0; k < m; k++)
{
for (int j = 0; j < c.m; j++)
{
mul.a[i][j] += (a[i][k] * c.a[k][j]);
mul.a[i][j] %= mod;
}
}
}
return mul;
}
};
Matrix quickpow(Matrix k, ll m)
{
Matrix ans = k.build(k.n);
while (m > 0)
{
if (m & 1)
{
ans = ans * k;
}
m >>= 1;
k = k * k;
}
return ans;
}