#include <stdio.h>
#include <string.h>
typedef long long LL;
const int MAXN = 100 + 5;
const LL mod = 10000007;
struct Mat
{
LL mat[MAXN][MAXN];
}A, E; // 题目矩阵和单位矩阵
int n;
void Unit(Mat a)
{
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
a.mat[i][j] = (i == j);
}
Mat operator*(Mat a, Mat b)
{
Mat c;
memset(c.mat, 0, sizeof(Mat));
for(int i = 0; i < n; i++)
{
for(int j = 0; j < n; j++)
{
for(int k = 0; k < n; k++)
{
if(a.mat[i][k] && b.mat[k][j])
{
c.mat[i][j] = (c.mat[i][j] + a.mat[i][k] * b.mat[k][j]);
if(c.mat[i][j] >= mod)
c.mat[i][j] %= mod;
}
}
}
}
return c;
}
Mat operator+(Mat a, Mat b)
{
Mat c;
memset(c.mat, 0, sizeof(Mat));
for(int i = 0; i < n; i++)
{
for(int j = 0; j < n; j++)
{
c.mat[i][j] = a.mat[i][j] + b.mat[i][j];
if(c.mat[i][j] >= mod)
c.mat[i][j] -= mod;
}
}
return c;
}
Mat operator^(Mat A, int x)
{
Mat c;
Unit(c); // 初始化为单位矩阵
for(; x; x >>= 1)
{
if(x & 1)
c = c * A;
A = A * A;
}
return c;
}
Mat sum(int x)
{
if(x == 1)
return A;
if(x & 1)
return (A^x) + sum(x-1);
else
return sum(x / 2) * ((A^(x/2))+E);
}