-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path10870.cpp
More file actions
104 lines (102 loc) · 2.29 KB
/
10870.cpp
File metadata and controls
104 lines (102 loc) · 2.29 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#include <iostream>
#include <algorithm>
using namespace std;
void mypower(long long a[][45],long long n,long long p,long long l)
{
long long cur[45][45],ans[45][45],nxt[45][45];
for(int i=0; i<n; i++)
{
for(int j=0;j<n;j++)
{
cur[i][j]=a[i][j];
}
fill_n(ans[i],45,0);
ans[i][i]=1;
}
l=l-n+1;
while(l)
{
if(l&1)
{
for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
{
nxt[i][j]=0;
for(int k=0; k<n; k++)
{
nxt[i][j]=(nxt[i][j]+(ans[i][k]*cur[k][j])%p)%p;
}
}
}
for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
{
ans[i][j]=nxt[i][j];
}
}
}
l=l>>1;
for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
{
nxt[i][j]=0;
for(int k=0; k<n; k++)
{
nxt[i][j]=(nxt[i][j]+((cur[i][k]*cur[k][j])%p))%p;
}
}
}
for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
{
cur[i][j]=nxt[i][j];
}
}
}
for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
{
a[i][j]=ans[i][j];
}
}
}
int main()
{
long long d,n,m,matrix[45][45],f[45];
while(cin>>d>>n>>m)
{
if(!d&&!n&&!m)
break;
for(int i=0; i<d; i++)
{
fill_n(matrix[i],45,0);
cin>>matrix[0][i];
matrix[0][i]%=m;
}
for(int i=0;i<d-1;i++)
matrix[i+1][i]=1;
for(int i=0; i<d; i++)
{
cin>>f[i];
f[i]%=m;
}
if(n<=2)
{
cout<<f[n-1]<<endl;
continue;
}
long long ans(0);
mypower(matrix,d,m,n-1);
for(int i=0;i<d;i++)
{
ans=(ans+(f[d-i-1]*matrix[0][i])%m)%m;
}
cout<<ans<<endl;
}
return 0;
}