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 ai,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
思路:建议借鉴学习博客:https://www.cnblogs.com/whatbeg/p/3971994.html
补充:想要构造的矩阵成立,要从第一列(下标从0开始)作为矩阵的开始
代码:
import java.util.Arrays;
import java.util.Scanner;
public class Main12 {
static int n;
static long m;
static final long mod=10000007;
public static long[][] multi(long a[][],long b[][]){
long res[][]=new long[n+2][n+2];
for(int i=0;i<n+2;i++)
Arrays.fill(res[i], 0);
for(int i=0;i<n+2;i++)
for(int j=0;j<n+2;j++)
for(int k=0;k<n+2;k++)
res[i][j]=(res[i][j]+a[i][k]*b[k][j]%mod)%mod;
return res;
}
public static long[][] quick_pow(long a[][]){
long res[][]=new long[n+2][n+2];
for(int i=0;i<n+2;i++)
for(int j=0;j<n+2;j++)
if(i==j) res[i][j]=1;
else res[i][j]=0;
long b=m-1;
while(b!=0){
if((b&1)==1) res=multi(res,a);
b>>=1;
a=multi(a,a);
}
return res;
}
public static void main(String[] args) {
Scanner scan=new Scanner(System.in);
while(scan.hasNext()){
n=scan.nextInt();
m=scan.nextLong();
long a[]=new long[n+2];
long[] sum=new long[n+2];
a[0]=0; sum[0]=0;
for(int i=1;i<=n;i++){
a[i]=scan.nextLong();
sum[i]=sum[i-1]+a[i];
}
if(m==1){
System.out.println(sum[n]+233);
continue;
}
long aa[][]=new long[n+2][n+2];
aa[0][0]=233;
for(int i=1;i<=n;i++)
aa[i][0]=233+sum[i];
aa[n+1][0]=3;
long init[][]=new long[n+2][n+2];
for(int i=0;i<n+2;i++)
Arrays.fill(init[i], 0);
for(int i=0;i<=n;i++)
init[i][0]=10;
for(int i=0;i<n+2;i++)
init[i][n+1]=1;
for(int i=1;i<=n;i++)
for(int j=1;j<=i;j++)
init[i][j]=1;
init=quick_pow(init);
aa=multi(init,aa);
System.out.println(aa[n][0]);
}
}
}