A simple math problem 
Time Limit: 3000/1000 MS (Java/others) memory limit: 32768/32768 K (Java/Others)
Total submission (s): 2780 accepted submission (s): 1649
 
 
Problem descriptionlele 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 cocould you help Lele to caculate F (k) % m. 
  
Inputthe 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. 
  
Outputfor each case, Output F (k) % m in one line. 
Sample Input 
10 99991 1 1 1 1 1 1 1 1 120 5001 0 1 0 1 0 1 0 1 0
  
Sample output 
45104
Illustration: 
 
 
This figure comes from: http://www.cnblogs.com/wally/archive/2013/03/01/2938305.html 
 
 
 
#include"iostream"#include"stdio.h"#include"string.h"#include"algorithm"#include"queue"#include"vector"using namespace std;#define N 10#define LL __int64int M,f[N];struct Mat{    LL mat[N][N];};Mat operator *(Mat a,Mat b){    int i,j,k;    Mat c;    for(i=0;i<N;i++)    {        for(j=0;j<N;j++)        {            c.mat[i][j]=0;            for(k=0;k<N;k++)            {                c.mat[i][j]+=(a.mat[i][k]*b.mat[k][j])%M;            }        }    }    return c;}int fun(Mat &a,int k){    int i;    Mat ans;    memset(ans.mat,0,sizeof(ans.mat));    k-=9;    for(i=0;i<N;i++)        ans.mat[i][i]=1;    for(i=1;i<N;i++)        a.mat[i][i-1]=1;    while(k)    {        if(k&1)            ans=ans*a;        k>>=1;        a=a*a;    }    LL s=0;    for(i=0;i<N;i++)    {        s+=ans.mat[0][i]*f[N-i-1]%M;        s%=M;    }    return s;}int main(){    int k,i;    Mat a;    while(scanf("%d%d",&k,&M)!=-1)    {        memset(a.mat,0,sizeof(a.mat));        for(i=0;i<N;i++)        {            scanf("%I64d",&a.mat[0][i]);            f[i]=i;        }        if(k<N)            printf("%d\n",i%M);        else            printf("%d\n",fun(a,k));    }    return 0;} 
 
 
 
 
HDU 1757 a simple math problem (matrix fast power)