Skip to content

Commit c9026a8

Browse files
Merge pull request matthewsamuel95#685 from av4l4nc14/add_solving_linear_recurrence
Add solving linear recurrence
2 parents f4c36fc + 464cc17 commit c9026a8

File tree

2 files changed

+113
-0
lines changed

2 files changed

+113
-0
lines changed
49.7 KB
Binary file not shown.
Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
#include <bits/stdc++.h>
2+
using namespace std;
3+
#define MOD 1000000000
4+
5+
typedef long long ll;
6+
7+
8+
9+
ll k;
10+
vector<ll> a,b,c;
11+
12+
vector<vector<ll> > multiply(vector<vector<ll> > M1 , vector<vector<ll> > M2)
13+
{
14+
vector<vector<ll> > M3(k+1,vector<ll>(k+1,0));
15+
16+
for(ll i=1;i<=k;i++){
17+
18+
for(ll j=1;j<=k;j++)
19+
{
20+
for(ll x=1;x<=k;x++)
21+
{
22+
M3[i][j]=(M3[i][j]+(M1[i][x]*M2[x][j])% MOD)%MOD;
23+
}
24+
}
25+
}
26+
return M3;
27+
28+
}
29+
30+
vector<vector<ll> > power(vector<vector<ll> > M1, ll n)
31+
{
32+
vector<vector<ll> > ANS(k+1,vector<ll>(k+1,0));
33+
34+
for(ll i=0;i<=k;i++)
35+
{
36+
ANS[i][i]=1;
37+
}
38+
39+
while(n)
40+
{
41+
if(n&1)
42+
ANS=multiply(ANS,M1);
43+
M1=multiply(M1,M1);
44+
n>>=1;
45+
46+
}
47+
return ANS;
48+
}
49+
50+
51+
ll compute(ll n){
52+
if(n==0)
53+
return 0;
54+
if(n<=k)
55+
return b[n-1];
56+
57+
vector<ll> F1(k+1,0);
58+
for(ll i=1;i<=k;i++)
59+
F1[i]=b[i-1];
60+
61+
vector<vector<ll> > T(k+1,vector<ll>(k+1,0));
62+
63+
for(ll i=1;i<k;i++)
64+
{
65+
for(ll j=1;j<=k;j++)
66+
{
67+
if(j==i+1)
68+
T[i][j]=1;
69+
else
70+
T[i][j]=0;
71+
}
72+
}
73+
74+
for(ll i=1;i<=k;i++)
75+
T[k][i]=c[k-i];
76+
77+
T=power(T,n-1);
78+
79+
ll res=0;
80+
81+
for(ll i=1;i<=k;i++)
82+
{
83+
res= (res + (T[1][i]*F1[i]))%MOD;
84+
}
85+
86+
return res;
87+
88+
}
89+
int main() {
90+
91+
ll x;
92+
ll n;
93+
cin>>k;
94+
95+
for(ll i=0;i<k;i++)
96+
{
97+
cin>>x;
98+
b.push_back(x);
99+
}
100+
101+
for(ll i=0;i<k;i++)
102+
{
103+
cin>>x;
104+
c.push_back(x);
105+
}
106+
cin>>n;
107+
cout<<compute(n)<<endl;
108+
109+
b.clear();
110+
c.clear();
111+
112+
return 0;
113+
}

0 commit comments

Comments
 (0)