In our daily life we often use 233 to express our feelings. Actually, we may say 2333, 23333, or 233333 ... in the same meaning. And here is the question: Suppose we have a matrix called 233 matrix. In the first line, it would be 233, 2333, 23333... (it means a 0,1 = 233,a 0,2 = 2333,a 0,3 = 23333...) Besides, in 233 matrix, we got a i,j = a i-1,j +a i,j-1( i,j ≠ 0). Now you have known a 1,0,a 2,0,...,a n,0, could you tell me a n,m in the 233 matrix?
Input
There are multiple test cases. Please process till EOF.
For each case, the first line contains two postive integers n,m(n ≤ 10,m ≤ 10 9). The second line contains n integers, a 1,0,a 2,0,...,a n,0(0 ≤ a i,0 < 2 31).
Output
For each case, output a n,m mod 10000007.
Sample Input
1 1
1
2 2
0 0
3 7
23 47 16
Sample Output
234
2799
72937
Hint
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define mod 10000007
typedef long long LL;
struct state
{
LL a[15][15];
};
state multi(state a,state b)
{
state c= {0};
for(int i=0; i<15; i++)
{
for(int j=0; j<15; j++)
{
for(int k=0; k<15; k++)
{
c.a[i][j]=(c.a[i][j]+(a.a[i][k]*b.a[k][j]))%mod;
}
}
}
return c;
}
state quick_pow(state a,LL n)
{
state b= {0};
for(int i=0; i<13; i++)
{
b.a[i][i]=1;
}
while(n)
{
if(n&1)
{
b=multi(a,b);
}
a=multi(a,a);
n=n/2;
}
return b;
}
int main()
{
LL n,m;
while(scanf("%lld%lld",&n,&m)!=EOF)
{
state a= {0},b= {0};
for(int i=1; i<=n; i++)
{
scanf("%lld",&b.a[i][0]);
}
b.a[0][0]=23;
b.a[n+1][0]=3;
for(int i=0; i<=n; i++)
{
a.a[i][0]=10;
a.a[i][n+1]=1;
for(int j=1; j<=i; j++)
{
a.a[i][j]=1;
}
}
a.a[n+1][n+1]=1;
printf("%lld\n",multi(quick_pow(a,m),b).a[n][0]);
}
return 0;
}