很基础的矩阵快速幂,但自己写的题还不够多,所以写代码的时候会磕磕巴巴,写完后有一些小错误还得再debug。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll D,N,M;
struct jz
{
ll n,m;
ll A[20][20];
void I(ll x)
{
memset(A,0,sizeof(A));
n=m=x;
for(ll i=0;i<x;i++)
A[i][i]=1;
}
void MEM()
{
memset(A,0,sizeof(A));
}
jz operator * (const jz& rhs) const
{
jz ret;
ret.n=n;
ret.m=rhs.m;
for(ll i=0;i<ret.n;i++)
for(ll j=0;j<ret.m;j++)
{
ret.A[i][j]=0;
for(ll k=0;k<m;k++)
ret.A[i][j]=(ret.A[i][j]+(A[i][k]*rhs.A[k][j])%M)%M;
}
return ret;
}
jz operator ^ (ll n) const
{
jz ret;
jz x=*this;
ret.I(x.n);
while(n)
{
if(n&1) ret=ret*x;
x=x*x;
n>>=1;
}
return ret;
}
};
int main()
{
while(scanf("%lld %lld %lld",&D,&N,&M)==3&&(D+N+M))
{
jz ji,chu;
ji.MEM();
ji.n=ji.m=D;
chu.MEM();
chu.n=D;
chu.m=1;
for(ll i=0;i<D;i++)
scanf("%lld",&ji.A[0][i]);
for(ll i=1,j=0;i<D;i++,j++)
ji.A[i][j]=1;
for(ll i=D-1;i>=0;i--)
scanf("%lld",&chu.A[i][0]);
if(N<=D) printf("%lld\n",chu.A[N-1][0]);
else printf("%lld\n",((ji^(N-D))*chu).A[0][0]);
}
return 0;
}