题意:
给你d,n,m,
a1,a2,a3,......
f(1),f(2),f(3),f(4).......
定义:f(n) = a1f(n − 1) + a2f(n − 2) + a3f(n − 3) + . . . + ad f(n − d), for n > d
求 f(n)%m
思路:
不多说水题
#include<bits/stdc++.h>
using namespace std;
struct node
{
long long a[15][15];
};
long long N;
const node A={
{
{0,1,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,1,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,1,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,1,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,1,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,1,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,1,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,1,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,1,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,1,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,1,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,1,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,1,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
}
};
node cheng(node a,node b,int m)
{
node c;
memset(c.a,0,sizeof(c.a));
for(int i=0;i<m;i++){
for(int j=0;j<m;j++)
for(int k=0;k<m;k++)
c.a[i][j]=(c.a[i][j]+(a.a[i][k]*b.a[k][j])%N)%N;
}
return c;
}
void p(node a,int m)
{
for(int i=0;i<m;i++){
for(int j=0;j<m;j++)
printf("%lld%c",a.a[i][j]," \n"[j==m-1]);
}
printf("\n");
}
int main()
{
int d,n,m;
node a,b;
while(~scanf("%d%d%d",&d,&n,&m),d+n+m)
{
N=m;
memset(a.a,0,sizeof(a.a));
memset(b.a,0,sizeof(b.a));
a=A;
for(int i=0;i<d;i++){
scanf("%lld",&(a.a[i][0]));
a.a[i][0]%=N;
}
for(int i=d-1;i>=0;i--){
scanf("%lld",&(b.a[0][i]));
b.a[0][i]%=N;
}
// p(b,d);
// p(a,d);
if(n<=d) {
printf("%lld\n",(b.a[0][n-d]%N+N)%N);
continue;
}
n-=d;
while(n)
{
if(n&1) b=cheng(b,a,d);
n>>=1;
a=cheng(a,a,d);
}
printf("%lld\n",(b.a[0][0]%N+N)%N);
}
return 0;
}