推出矩阵公式即可:(盗图)
传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1757
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int len_Matrix;
int Mod;
struct Matrix{
int M[15][15];
};
int tempa[15];
int a[15];
void Init_Matrix(Matrix * tmp){
for(int i=0;i<len_Matrix;i++){
for(int j=0;j<len_Matrix;j++){
tmp -> M[i][j] = 0;
}
}
tmp -> M[1][0] = 1;
for(int i=1;i<len_Matrix;i++){
for(int j=1;j<len_Matrix;j++){
if(tmp -> M[i-1][j-1]){
tmp -> M[i][j] = 1;
}
}
}
for(int i=0;i<len_Matrix;i++){
tmp -> M[0][i] = tempa[i];
}
}
Matrix multiply(Matrix a1,Matrix a2){
Matrix ans;
for(int i=0;i<len_Matrix;i++){
for(int j=0;j<len_Matrix;j++){
ans.M[i][j] = 0;
for(int k=0;k<len_Matrix;k++){
ans.M[i][j] = (a1.M[i][k]*a2.M[k][j]+ans.M[i][j])%Mod;
}
}
}
return ans;
}
Matrix Pow(Matrix tmp,int nl){
Matrix ans ;
for(int i=0;i<len_Matrix;i++){
for(int j=0;j<len_Matrix;j++){
if(i==j)ans.M[i][j] = 1;
else ans.M[i][j] = 0;
}
}
while(nl){
if(nl&1){
ans = multiply(ans,tmp);
}
tmp = multiply(tmp,tmp);
nl /= 2;
}
return ans;
}
void Solve(int k,Matrix tmp){
if(k<10)
printf("%d\n",a[k]%Mod);
else{
Matrix ans = Pow(tmp,k-9);
//Debug_Matrix(ans);
int zans =0;
for(int i=0;i<len_Matrix;i++){
zans = (zans + ans.M[0][i] * a[9-i]) % Mod;
}
printf("%d\n",zans);
}
}
void Input(){
int k,m;
while(~scanf("%d %d",&k,&m)){
for(int i=0;i<10;i++){
scanf("%d",tempa+i);
}
len_Matrix = 10;
Mod = m;
Matrix tmp;
Init_Matrix(&tmp);
for(int i=0;i<10;i++){
a[i] = i;
}
Solve(k,tmp);
}
}
void File(){
freopen("a.in","r",stdin);
freopen("a.out","w",stdin);
}
int main(void){
//File();
Input();
return 0;
}