链接:点击打开链接
题意: 当x<10时f(x) = x.当x>=10,f(x)=a0*f(x-1)+a1*f(x-2)+a2*f(x-3)+ …… +a9*f(x-10),求f(k)%m
代码:
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
struct node{
long long m[10][10];
};
long long m;
node P={0,0,0,0,0,0,0,0,0,0,
1,0,0,0,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,0,0,
0,0,1,0,0,0,0,0,0,0,
0,0,0,1,0,0,0,0,0,0,
0,0,0,0,1,0,0,0,0,0,
0,0,0,0,0,1,0,0,0,0,
0,0,0,0,0,0,1,0,0,0,
0,0,0,0,0,0,0,1,0,0,
0,0,0,0,0,0,0,0,1,0}; //根据表达式构造出矩阵
node I={1,0,0,0,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,0,0,
0,0,1,0,0,0,0,0,0,0,
0,0,0,1,0,0,0,0,0,0,
0,0,0,0,1,0,0,0,0,0,
0,0,0,0,0,1,0,0,0,0,
0,0,0,0,0,0,1,0,0,0,
0,0,0,0,0,0,0,1,0,0,
0,0,0,0,0,0,0,0,1,0,
0,0,0,0,0,0,0,0,0,1,};
node mul(node a,node b){
int i,j,k;
node c;
for(i=0;i<10;i++)
for(j=0;j<10;j++){
c.m[i][j]=0;
for(k=0;k<10;k++)
c.m[i][j]+=(a.m[i][k]*b.m[k][j])%m;
c.m[i][j]%=m;
}
return c;
}
node quickmod(long long n){
node a,b;
a=P;b=I;
while(n){
if(n&1)
b=mul(b,a);
n/=2;
a=mul(a,a);
}
return b;
} //矩阵快速幂模板
long long a[20];
int main(){
long long k,i,sum;
node temp;
while(cin>>k>>m){
for(i=0;i<10;i++)
cin>>a[i];
if(k<10){
cout<<k%m<<endl;
continue;
} //小于10的时候单独判断
for(i=0;i<10;i++)
P.m[0][i]=a[i];
temp=quickmod(k-9);
sum=0;
for(i=0;i<10;i++)
sum+=(temp.m[0][i]*(9-i))%m;
sum%=m;
cout<<sum<<endl;
}
return 0;
}