地址:http://acm.hdu.edu.cn/showproblem.php?pid=5015
思路:很明显的矩阵快速幂,推出矩阵后就好些了。
代码:
/***************************************************
写这题的报告主要是为了矩阵快速幂的模板
***************************************************/
#include
#include
#include
#include
using namespace std;
#define LL __int64
#define Mod 10000007
struct Mat {
LL mat[15][15];
void cle(){
memset(mat,0,sizeof(mat));
}
}two,three;
int m,n;
Mat operator * (Mat a, Mat b) { //矩阵快速幂的模板
Mat c;
c.cle(); //清空c矩阵
for(int k = 0; k <= m+1; ++k) { //注意乘的范围
for(int i = 0; i <= m+1; ++i) {
if(a.mat[i][k] <= 0) continue;
for(int j = 0; j <= m+1; ++j) {
if(b.mat[k][j] <= 0) continue;
c.mat[i][j] += a.mat[i][k] * b.mat[k][j];
if(c.mat[i][j]>Mod) c.mat[i][j]%=Mod; //有取mod的在这里取mod
}
}
}
return c;
}
int main(){
while(scanf("%d%d",&m,&n)>0){
two.cle();
three.cle();
two.mat[0][0]=233;
two.mat[0][m+1]=3;
for(int i=1;i<=m;i++)
scanf("%d",&two.mat[0][i]);
for(int i=0;i<=m;i++)
for(int j=i;j<=m;j++)
three.mat[i][j]=1;
three.mat[0][0]=10;
three.mat[m+1][0]=1;
three.mat[m+1][m+1]=1;
while(n){
if(1&n){
two=two*three;
}
three=three*three;
n/=2;
}
printf("%I64d\n",two.mat[0][m]);
}
return 0;
}