分析:
矩阵快速幂求递推式
练模板
//这里写代码片
#include<cstdio>
#include<cstring>
#include<cstdio>
#define ll long long
using namespace std;
ll n,p,f[20],a[20];
int d;
struct node{
ll H[20][20];
node operator *(const node &a) const
{
node ans;
for (int i=1;i<=d;i++)
for (int j=1;j<=d;j++)
{
ans.H[i][j]=0;
for (int k=1;k<=d;k++)
ans.H[i][j]=(ans.H[i][j]+H[i][k]*a.H[k][j]%p)%p;
}
return ans;
}
void clear()
{
memset(H,0,sizeof(H));
}
node KSM(ll b)
{
node ans=(*this),a=(*this);
b--;
while (b)
{
if (b&1)
ans=ans*a;
b>>=1;
a=a*a;
}
return ans;
}
};
node ans,H;
int main()
{
scanf("%d%lld%lld",&d,&n,&p);
while (d&&n&&p)
{
H.clear();
for (int i=1;i<=d;i++)
scanf("%lld",&a[i]),
H.H[i][1]=a[i]%p;
for (int i=1;i<=d;i++)
scanf("%lld",&f[i]);
if (n<=d)
{
printf("%lld
",f[n]%p);
scanf("%d%lld%lld",&d,&n,&p);
continue;
}
for (int i=1;i<d;i++)
H.H[i][i+1]=1;
ans=H.KSM(n-d);
ll sum=0;
for (int i=1;i<=d;i++)
sum=(sum+(ans.H[i][1]%p*f[d-i+1]%p)%p)%p;
printf("%lld
",sum%p);
scanf("%d%lld%lld",&d,&n,&p);
}
}