,并且
,所以
.
设, 其中,我们假设
,方便递推
设转移矩阵,有
.
代码如下:
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 15, mod = 10000007;
int F[N], G[N][N];
int n, m;
void mul(int a[N], int b[N][N]){
int ans[N] = {0};
for (int i = 0; i <= n + 1; ++i)
for (int k = 0; k <= n + 1; ++k)
ans[i] = (ans[i] + a[k] * b[k][i]) % mod;
memcpy(a, ans, sizeof ans);
}
void mulslf(int a[N][N], int b[N][N]){
int ans[N][N] = {0};
for (int i = 0; i <= n + 1; ++i)
for (int j = 0; j <= n + 1; ++j)
for(int k = 0; k <= n + 1; ++k)
ans[i][j] = (ans[i][j] + a[i][k] * b[k][j]) % mod;
memcpy(a, ans, sizeof ans);
}
signed main(){
ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
while (cin >> n >> m){
memset(F, 0, sizeof F);
memset(G, 0, sizeof G);
//F是状态矩阵.初始化为F[23, a[1,0], a[2,0],...a[n,0], 3]
for (int i = 1; i <= n; ++i)
cin >> F[i];
F[0] = 23, F[n + 1] = 3;
//G是转移矩阵.
for (int i = 0; i <= n; ++i){
G[0][i] = 10;
G[n + 1][i] = 1;
}
G[n + 1][n + 1] = 1;
for (int i = 1; i <= n; ++i)
for (int j = i; j <= n; ++j)
G[i][j] = 1;
while (m){
if (m & 1)
mul(F, G);
m >>= 1;
mulslf(G, G);
}
cout << F[n] << "\n";
}
}
总结:
1.的转化.
2.如果出现多余的列时,不要初始化为0,要按照单位矩阵的形式进行初始化.