//暴力绝对不行,只能用矩阵ksm
/*ksm思想:1.第m列由第m-1列 *10+3得。把一列看成两边的两列
2.根据递推公式。即可列出中间矩阵 */
#include<bits/stdc++.h>
using namespace std;
const int maxn=15;
typedef long long ll;
ll mod=1e7+7;
ll n,m,a[maxn];
typedef struct jz{
ll m[maxn][maxn];
}jz;
jz mul(jz a,jz b){
jz c;
for(int i=0;i<=n+1;i++)
for(int j=0;j<=n+1;j++){
c.m[i][j]=0;
for(int k=0;k<=n+1;k++)
c.m[i][j]=(c.m[i][j]+a.m[i][k]*b.m[k][j]%mod)%mod;
}
return c;
}
jz ksm(jz a,ll b){
jz ans;
for(int i=0;i<=n+1;i++)
for(int j=0;j<=n+1;j++)
ans.m[i][j]=1*(i==j);
while(b){
if(b%2) ans=mul(ans,a);
//ans的乘写在a没平方之前
a=mul(a,a);
b/=2;
}
return ans;
}
int main(){
while(~scanf("%lld%lld",&n,&m)){
for(int i=1;i<=n;i++)
scanf("%lld",&a[i]);
a[0]=23;a[n+1]=3;
jz A,B;
for(int i=0;i<=n+1;i++)
for(int j=0;j<=n+1;j++){
A.m[i][j]=0;
if(j==n+1) A.m[i][j]=1;
else if(i!=n+1){
if(j==0) A.m[i][j]=10;
else if(i>=j) A.m[i][j]=1;
}
}
B=ksm(A,m);
ll res=0;
for(int i=0;i<=n+1;i++)
res=(res+B.m[n][i]*a[i]%mod)%mod;
printf("%lld\n",res);
}
}