Skip to content
Snippets Groups Projects
Commit a772185e authored by Bruno Freitas Tissei's avatar Bruno Freitas Tissei
Browse files

Fix matrix and linear recurrence

parent 0218c476
No related branches found
No related tags found
No related merge requests found
...@@ -25,13 +25,15 @@ ...@@ -25,13 +25,15 @@
* [x1 x2]^n * [x1 x2]^n
* [ 1 0] * [ 1 0]
*/ */
matrix solve(ll x, ll y, ll n) { template <typename T>
matrix in(2); matrix<T> solve(ll x, ll y, ll n) {
matrix<T> in(2);
// Example
in[0][0] = x % MOD; in[0][0] = x % MOD;
in[0][1] = y % MOD; in[0][1] = y % MOD;
in[1][0] = 1; in[1][0] = 1;
in[1][1] = 0; in[1][1] = 0;
return fast_pow(in, n); return fast_pow<T>(in, n);
} }
...@@ -2,20 +2,21 @@ ...@@ -2,20 +2,21 @@
* Matrix * Matrix
*/ */
template <typename T>
struct matrix { struct matrix {
int r, c; int r, c;
vector<vector<ll>> m; vector<vector<T>> m;
matrix(int k) : r(k), c(k) { matrix(int k) : r(k), c(k) {
m = vector<vector<ll>>(k, vector<ll>(k, 0)); m = vector<vector<T>>(k, vector<T>(k, 0));
} }
matrix(int r, int c) : r(r), c(c) { matrix(int r, int c) : r(r), c(c) {
m = vector<vector<ll>>(r, vector<ll>(c, 0)); m = vector<vector<T>>(r, vector<T>(c, 0));
} }
matrix operator*(matrix a) { matrix operator*(matrix a) {
assert(r == a.c && c = a.r); assert(r == a.c && c == a.r);
matrix res(r, c); matrix res(r, c);
for (int i = 0; i < r; i++) for (int i = 0; i < r; i++)
...@@ -47,11 +48,7 @@ struct matrix { ...@@ -47,11 +48,7 @@ struct matrix {
m[i][i] = 1; m[i][i] = 1;
} }
ll *operator[](int i) { vector<T> &operator[](int i) {
return m[i]; return m[i];
} }
void clear() {
mset(m, 0);
}
}; };
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment