西安网络赛的第9题,想了很久也没想出来怎么做
感觉这个题的难点就在于怎么构造矩阵。。。
发个解题链接:点击打开链接
看懂还是很easy的,但是怎么想到的就是能力问题了
看过之后我写的代码如下:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define MOD 10000007
#define LL long long
using namespace std;
int m, n;
int a[13];
LL sum[13];
struct Matrix {
LL m[13][13];
Matrix() {
memset(m, 0, sizeof(m));
for(int i=1; i<=n+2; ++i)
m[i][i] = 1ll;
}
};
Matrix Mul(Matrix a, Matrix b) {
Matrix res;
for(int i=1; i<=n+2; ++i) {
for(int j=1; j<=n+2; ++j) {
res.m[i][j] = 0;
for(int k=1; k<=n+2; ++k) {
res.m[i][j] = (res.m[i][j]+(a.m[i][k]*b.m[k][j])%MOD+MOD)%MOD;
}
}
}
return res;
}
Matrix Pow(Matrix a, int b) {
Matrix res;
while(b) {
if(b & 1) {
res = Mul(res, a);
}
a = Mul(a, a);
b >>= 1;
}
return res;
}
int main(void) {
while(~scanf("%d%d", &n, &m)) {
sum[0] = 0ll;
for(int i=1; i<=n; ++i) {
scanf("%d", &a[i]);
sum[i] = (sum[i-1]+a[i])%MOD;
}
if(m == 1) {
cout << (sum[n]+233ll)%MOD << endl;
continue;
}
Matrix base, right, ans;
memset(base.m, 0, sizeof(base.m));
for(int i=1; i<=n+1; ++i) {
base.m[i][1] = 10ll;
}
for(int i=2; i<=n+1; ++i) {
for(int j=2; j<=i; ++j) {
base.m[i][j] = 1ll;
}
}
for(int i=1; i<=n+2; ++i)
base.m[i][n+2] = 1ll;
memset(right.m, 0, sizeof(right.m));
right.m[1][1] = 233ll;
right.m[n+2][1] = 3ll;
for(int i=2; i<=n+1; ++i) {
right.m[i][1] = (sum[i-1]+233ll)%MOD;
}
base = Pow(base, m-1);
ans = Mul(base, right);
cout << ans.m[n+1][1]%MOD << endl;
}
return 0;
}