题意:
一个233矩阵的第一行为0,233,2333,23333,……233……3;第一列为 0,a[1],a[2],a[3]……a[k]对于其他位置的值满足matrix[i][j]=matrix[i-1][j]+matrix[i][j-1];
给你数组a[] 问matrix[n][m]的值是什么
分析:
可以知道根据所给的规矩构造一个矩阵
10 0 0 0 的m次方的第n行和 矩阵 23 相乘就是所求的
10 1 0 0 a[1]
10 1 1 0 a[2]
0 0 0 1 3
23 和 3 是添加为了构造233 2333的
ACcode:
#include <bits/stdc++.h>
#define mod 10000007
#define ll long long
using namespace std;
struct Matrix{
ll mat[12][12];
};
Matrix mul(Matrix a,Matrix b,int n){
Matrix ret;
for(int i=0;i<n+2;++i)
for(int j=0;j<n+2;++j){
ret.mat[i][j]=0;
for(int k=0;k<n+2;++k)
ret.mat[i][j]=(a.mat[i][k]*b.mat[k][j]+ret.mat[i][j])%mod;
}
return ret;
}
Matrix pow(Matrix a,int n,ll m){
Matrix ret;
memset(ret.mat,0,sizeof(ret.mat));
for(int i=0;i<n+2;++i)ret.mat[i][i]=1;
while(m){
if(m&1)ret=mul(ret,a,n);
a=mul(a,a,n);
m>>=1;
}
return ret;
}
int main(){
int n;
ll m,a[12];
while(cin>>n>>m){
a[0]=23;a[n+1]=3;
for(int i=1;i<=n;++i)cin>>a[i];
Matrix tmp;
memset(tmp.mat,0,sizeof(tmp.mat));
for(int i=0;i<n+1;++i)tmp.mat[i][0]=10;
for(int i=0;i<n+2;++i)tmp.mat[i][n+1]=1;
for(int i=1;i<=n;++i)
for(int j=1;j<=i;++j)
tmp.mat[i][j]=1;
tmp=pow(tmp,n,m);
ll ans=0;
for(int i=0;i<n+2;++i)
ans=(ans+tmp.mat[n][i]*a[i]+mod)%mod;
cout<<ans<<'\12';
}
return 0;
}