Skip to content

Commit efae7f9

Browse files
committed
Matrix Exponentiaton, Linear Recurrence
1 parent d68207a commit efae7f9

File tree

2 files changed

+183
-0
lines changed

2 files changed

+183
-0
lines changed

SEQ-d.cpp

+101
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
#include<bits/stdc++.h>
2+
using namespace std;
3+
4+
typedef long long int ll;
5+
typedef vector<vector<ll> > vii;
6+
typedef vector<ll> vi;
7+
const int m = (int)1e9;
8+
int k;
9+
vi b;
10+
vi c;
11+
12+
//matrix mul
13+
vii mul(const vii& A, const vii& B) {
14+
vii C(k, vi(k, 0));
15+
16+
for (int r = 0; r < k; ++r) {
17+
for (int c = 0; c < k; ++c) {
18+
for (int x = 0; x < k; ++x) {
19+
C[r][c] += (A[r][x] * B[x][c]) % m;
20+
C[r][c] %= m;
21+
}
22+
}
23+
}
24+
return C;
25+
}
26+
27+
//matrix exponentiation
28+
vii pow(vii& A, int n) {
29+
if (n <= 1) return A;
30+
31+
//if odd
32+
if (n & 1) return mul(A, pow(A, n - 1));
33+
34+
vii ans = pow(A, n / 2);
35+
return mul(ans, ans);
36+
}
37+
38+
int sol(int n){
39+
vii t(k, vi(k, 0));
40+
41+
if (n <= k) return b[n - 1];
42+
43+
//setting transformation matrix
44+
reverse(c.begin(), c.end());
45+
46+
for(int r = 0; r < k; ++r){
47+
for(int col = 0; col < k; ++col){
48+
//Make sure that T.Fn-1 = Fn
49+
//no skipping should be there else formula needs to be modified
50+
51+
t[r][col] = 0;
52+
if (col == r + 1) t[r][col] = 1;
53+
//last row
54+
if (r == k - 1) t[r][col] = c[col];
55+
56+
}
57+
}
58+
59+
//setting f
60+
vi f(k);
61+
copy(b.begin(), b.end(), f.begin());
62+
63+
//compute T^n
64+
int exp = n-1;
65+
vii tn = pow(t, exp);
66+
67+
ll ans = 0;
68+
// getting the first row
69+
for(int i = 0; i < k; ++i){
70+
ans += (tn[0][i] * f[i]) % m;
71+
ans %= m;
72+
}
73+
return ans;
74+
75+
}
76+
77+
int main() {
78+
int t;
79+
cin >> t;
80+
while (t--)
81+
{
82+
cin >> k;
83+
b.resize(k);
84+
c.resize(k);
85+
86+
for (int i = 0; i < k; ++i) {
87+
cin >> b[i];
88+
}
89+
90+
for (int i = 0; i < k; ++i) {
91+
cin >> c[i];
92+
}
93+
94+
int n;
95+
cin >> n;
96+
cout << sol(n) << "\n"; //never use endl
97+
b.clear();
98+
c.clear();
99+
}
100+
101+
}

SEQ-h.cpp

+82
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
#include<iostream>
2+
using namespace std;
3+
#define mod 1000000000
4+
int size;
5+
6+
void multiply(long long int a[][10],long long int b[][10]){
7+
int i,j,k;
8+
long long int ans[20][20]={};
9+
for(i=0;i<size;i++){
10+
for(j=0;j<size;j++){
11+
for(k=0;k<size;k++){
12+
ans[i][j]=(ans[i][j] + a[i][k]*b[k][j])%mod;
13+
ans[i][j]=ans[i][j]%mod;
14+
}
15+
}
16+
}
17+
for(i=0;i<size;i++){
18+
for(j=0;j<size;j++){
19+
a[i][j]=ans[i][j];
20+
}
21+
}
22+
23+
}
24+
25+
void power(long long int second[][10],long long int n){
26+
long long int current[20][10]={},i,j;
27+
for(i=0;i<size;i++){
28+
for(j=0;j<size;j++)
29+
current[i][j]=second[i][j];
30+
}
31+
if(n<=1){
32+
return;
33+
}
34+
if(n&1){
35+
power(second,n-1);
36+
multiply(second ,current);
37+
}
38+
else{
39+
power(second,n/2);
40+
multiply(second,second);
41+
}
42+
}
43+
int main(){
44+
int t;
45+
cin>>t;
46+
while(t--){
47+
int i,j;cin>>size;
48+
long long int n,b[20],c[20];
49+
for(i=0;i<size;i++){
50+
cin>>b[i];
51+
}
52+
for(i=0;i<size;i++){
53+
cin>>c[i];
54+
}
55+
cin>>n;
56+
if(n<=size){
57+
cout<<b[size-n]<<"\n";
58+
}else{
59+
long long int second[20][10]={},ans=0;
60+
for(i=0;i<size;i++){
61+
second[0][i]=c[i];
62+
}
63+
for(i=1;i<size;i++){
64+
second[i][i-1]=1;
65+
}
66+
long long int e=n-size;
67+
power(second,e);
68+
69+
for(i=0;i<size;i++){
70+
ans=(ans+second[0][i]*b[size-i-1])%mod;
71+
ans%=mod;
72+
}
73+
// for(i=0;i<size;i++){
74+
// for(j=0;j<size;j++)
75+
// cout<<second[i][j]<<" ";
76+
// cout<<"\n";
77+
// }
78+
cout<<ans<<"\n";
79+
80+
}
81+
}
82+
}

0 commit comments

Comments
 (0)