Lele now is thinking about a simple function f(x).
If x < 10 f(x) = x.
If x >= 10 f(x) = a0 * f(x-1) + a1 * f(x-2) + a2 * f(x-3) + …… + a9 * f(x-10);
And ai(0<=i<=9) can only be 0 or 1 .
Now, I will give a0 ~ a9 and two positive integers k and m ,and could you help Lele to caculate f(k)%m.
Input
The problem contains mutiple test cases.Please process to the end of file.
In each case, there will be two lines.
In the first line , there are two positive integers k and m. ( k<2*10^9 , m < 10^5 )
In the second line , there are ten integers represent a0 ~ a9.
Output
For each case, output f(k) % m in one line.
Sample Input
10 9999 1 1 1 1 1 1 1 1 1 1 20 500 1 0 1 0 1 0 1 0 1 0
Sample Output
45 104
思路:
代码:
import java.util.Arrays;
import java.util.Scanner;
public class main11 {
static int k,m;
static final int max=10;
public static int[][] multi(int a[][],int b[][]){
int res[][]=new int[max][max];
for(int i=0;i<max;i++)
Arrays.fill(res[i], 0);
for(int i=0;i<max;i++)
for(int j=0;j<max;j++)
for(int t=0;t<max;t++)
res[i][j]=(res[i][j]+a[i][t]*b[t][j]%m)%m;
return res;
}
static final int[][] quick_pow(int a[][]){
int res[][]=new int[max][max];
for(int i=0;i<max;i++)
for(int j=0;j<max;j++)
if(i==j) res[i][j]=1;
else res[i][j]=0;
int b=k-9;
while(b!=0){
if((b&1)==1) res=multi(res,a);
b/=2;
a=multi(a,a);
}
return res;
}
public static void main(String[] args) {
Scanner scan=new Scanner(System.in);
while(scan.hasNext()){
k=scan.nextInt();
m=scan.nextInt();
int arr[]=new int[max];
for(int i=0;i<max;i++)
arr[i]=scan.nextInt();
if(k<10){
System.out.println(k);
continue;
}
int a[][]=new int[max][max];
for(int i=0;i<max;i++)
Arrays.fill(a[i], 0);
for(int i=0;i<10;i++)
a[0][i]=arr[i];
for(int i=1;i<10;i++)
a[i][i-1]=1;
int b[][]=new int[max][max];
b=quick_pow(a);
int c[][]=new int[max][max];
for(int i=0;i<max;i++)
Arrays.fill(c[i], 0);
for(int i=0;i<10;i++)
c[i][0]=9-i;
c=multi(b,c);
System.out.println(c[0][0]);
}
}
}