矩阵快速幂裸题
- 代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
struct Matrix{
ll e[18][18];
};
Matrix Multiply(Matrix a, Matrix b,ll d,ll mod)
{
Matrix ans;
for(ll i=0; i<d; i++)
for(ll j=0; j<d; j++)
{
ans.e[i][j]=0;
for(ll k=0; k<d; k++)
{
ans.e[i][j]+=(a.e[i][k]*b.e[k][j])%mod;
ans.e[i][j]%=mod;
}
}
return ans;
}
Matrix quickpow(Matrix a, ll n,ll d,ll mod)
{
Matrix result;
for(ll i=0; i<d; i++)
for(ll j=0; j<d; j++)
if(i==j) result.e[i][j]=1;
else result.e[i][j]=0;
while(n)
{
if(n&1)
result = Multiply(result, a,d,mod);
n=n>>1;
a=Multiply(a, a,d,mod);
}
return result;
}
int main()
{
ll m,n,d,a[18],b[18];
while(cin>>d>>n>>m,d||m||n)
{
for(ll i=0;i<d;++i) {cin>>a[i];a[i]%=m;}
for(ll i=0;i<d;++i) {cin>>b[i];b[i]%=m;}
if(n<=d) {cout<<b[n-1]<<endl;continue;}
Matrix A;
memset(A.e,0,sizeof(A.e));
A.e[0][0]=a[0];
for(ll i=1;i<d;++i)
{
A.e[0][i]=a[i];
A.e[i][i-1]=1;
}
A=quickpow(A,n-d,d,m);
ll ans=0;
for(ll i=0;i<d;++i)
ans=(ans+A.e[0][i]*b[d-i-1]%m)%m;
cout<<ans<<endl;
}
return 0;
}