一开始根本没想到可以这样构造矩阵,看了半天才看懂,太巧了这题。。
较好的讲解:点击打开链接
还要注意的是要使用long long
代码:
#include
#include
#include
using namespace std;
const int mod = 10000007;
int n, m, N;
struct node
{
long long s[15][15];
};
node mul(node a, node b)
{
node t;
memset(t.s, 0, sizeof(t.s));
for(int i = 0; i < N; i++)
for(int j = 0; j < N; j++)
for(int k = 0; k < N; k++)
t.s[i][j] = (t.s[i][j]+a.s[i][k]*b.s[k][j])%mod;
return t;
}
node mt_pow(node p, int k)
{
node q;
memset(q.s, 0, sizeof(q.s));
for(int i = 0; i < N; i++)
q.s[i][i] = 1;
while(k)
{
if(k&1) q = mul(p, q);
p = mul(p, p);
k /= 2;
}
return q;
}
int main(void)
{
int a[15];
while(~scanf("%d%d", &n, &m))
{
N = n+2;
a[0] = 23, a[n+1] = 3;
for(int i = 1; i <= n; i++)
scanf("%d", &a[i]);
node base;
//init
memset(base.s, 0, sizeof(base.s));
for(int i = 0; i <= n; i++)
base.s[i][0] = 10, base.s[i][n+1] = 1;
base.s[n+1][n+1] = 1;
for(int i = 1; i <= n; i++)
for(int j = 1; j <= i; j++)
base.s[i][j] = 1;
node ans = mt_pow(base, m);
int res = 0;
for(int i = 0; i < N; i++)
res = (res+a[i]*ans.s[n][i])%mod;
printf("%d\n", res);
}
return 0;
}
Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 2031 Accepted Submission(s): 1185