http://acm.hdu.edu.cn/showproblem.php?pid=1757
矩阵递推,加快速幂,一直WA...............
#include<iostream>
struct Matrix{
int m[10][10];
} matrix;
int m;
__int64 k;
int a[10];
Matrix res;
int ans;
Matrix mat_mul(const Matrix& l,const Matrix& r)
{
Matrix res;
memset(&res,0,sizeof(res));
for(int i=0;i!=10;i++){
for(int j=0;j!=10;j++){
for(int k=0;k!=10;k++){
res.m[i][j]+=l.m[i][k]*r.m[k][j];
}
}
}
return res;
}
void div(__int64 N)
{
memset(res.m,0,sizeof(res.m));
for(int i=0;i!=10;i++){
res.m[i][i]=1;
}
while (N){
if(N&1){
res=mat_mul(res,matrix);
}
N>>=1;
matrix= mat_mul(matrix,matrix);
}
}
int main()
{
while (~scanf("%I64d%d",&k,&m)){
for(int i=0;i!=10;i++){
std::cin>>a[i];
}
if(k<10)
{
printf("%d\n",k%m) ;
continue ;
}
for(int i=0;i!=9;i++){
matrix.m[i][i+1]=1;
}
for(int i=0;i!=10;i++){
matrix.m[9][i]=a[9-i];
}
div(k-9);
for(int i=0;i!=10;i++){
ans+=res.m[9][i]*i;
ans=ans%m;
}
//ans=ans%m;
std::cout<<ans<<std::endl;
memset(&matrix,0,sizeof(matrix));
memset(&res,0,sizeof(res));
memset(a,0,sizeof(a));
ans=0;
}
}