很显然矩阵的第一列为:
0
a[1]
a[2]
a[3]
a[4]
我们转化一下,转化为
23
a[1]
a[2]
a[3]
a[4]
3
那么由第一列转移到第二列则为
23*10+3
a[1]+23*10+3
a[2]+a[1]+23*10+3
a[3]+a[2]+a[1]+23*10+3
a[4]+a[3]+a[2]+a[1]+23*10+3
3
很显然转移矩阵A就出来了:
10 0 0 0 0 1
10 1 0 0 0 1
10 1 1 0 0 1
10 1 1 1 0 1
10 1 1 1 1 1
0 0 0 0 0 1
那么最后一列就是A的m次方*第一列。
#include
#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;
const int NI = 15;
const int mod = 10000007;
struct Mat {
ll mat[NI][NI];
Mat() {
memset(mat, 0, sizeof(mat));
}
};
int n, m;
Mat operator * (Mat a, Mat b) {
Mat c;
for(int i = 1; i <= n+2; i++) {
for(int k = 1; k <= n+2; k++) {
for(int j = 1; j <= n+2; j++) {
c.mat[i][j] = (c.mat[i][j] + a.mat[i][k] * b.mat[k][j]) % mod;
}
}
}
return c;
}
Mat operator ^ (Mat a, int k) {
Mat c;
for(int i = 1; i <= n+2; ++i)
for(int j = 1; j <= n+2; ++j)
c.mat[i][j] = (i == j); //初始化为单位矩阵
while(k) {
if(k&1) c = c * a;
a = a * a;
k >>= 1;
}
return c;
}/*
void print(Mat &A)
{
cout<<"matrix"<