【HDU 5015】233 Matrix
【题目链接】
http://acm.hdu.edu.cn/showproblem.php?pid=5015
【算法】
矩阵乘法
【代码】
#include<bits/stdc++.h> using namespace std; const int P = 10000007; int i,j,n,m,ans; int a[20],val[20]; struct Matrix { int mat[20][20]; } b; inline void multipy(Matrix &a,Matrix b) { int i,j,k; Matrix res; memset(res.mat,0,sizeof(res.mat)); for (i = 0; i <= n + 1; i++) { for (j = 0; j <= n + 1; j++) { for (k = 0; k <= n + 1; k++) { res.mat[i][j] = (res.mat[i][j] + 1ll * a.mat[i][k] * b.mat[k][j]) % P; } } } a = res; } inline Matrix power(Matrix a,int n) { Matrix res; memcpy(res.mat,a.mat,sizeof(a.mat)); n--; while (n > 0) { if (n & 1) multipy(res,a); multipy(a,a); n >>= 1; } return res; } int main() { while (scanf("%d%d",&n,&m) != EOF) { ans = 0; a[0] = 0; for (i = 1; i <= n; i++) scanf("%d",&a[i]); val[0] = 233; for (i = 1; i <= n; i++) val[i] = (val[i-1] % P + a[i] % P) % P; val[n+1] = 3; if (m == 1) { printf("%d\n",val[n]); continue; } memset(b.mat,0,sizeof(b.mat)); for (i = 0; i <= n; i++) { b.mat[i][0] = 10; b.mat[i][n+1] = 1; for (j = 1; j <= n; j++) { b.mat[i][j] = (i >= j); } } b.mat[n+1][n+1] = 1; b = power(b,m-1); for (i = 0; i <= n + 1; i++) ans = (ans + 1ll * b.mat[n][i] * val[i]) % P; printf("%d\n",ans); } return 0; }