From a772185eedb80102eb527d82ca816fd44013b0c3 Mon Sep 17 00:00:00 2001
From: Bruno Freitas Tissei <bft15@inf.ufpr.br>
Date: Sat, 23 Mar 2019 11:32:17 -0300
Subject: [PATCH] Fix matrix and linear recurrence

Signed-off-by: Bruno Freitas Tissei <bft15@inf.ufpr.br>
---
 algorithms/math/linear_recurrence.cpp |  8 +++++---
 algorithms/math/matrix.cpp            | 15 ++++++---------
 2 files changed, 11 insertions(+), 12 deletions(-)

diff --git a/algorithms/math/linear_recurrence.cpp b/algorithms/math/linear_recurrence.cpp
index 3235d59..9c3c37b 100644
--- a/algorithms/math/linear_recurrence.cpp
+++ b/algorithms/math/linear_recurrence.cpp
@@ -25,13 +25,15 @@
  *   [x1  x2]^n
  *   [ 1   0]
  */
-matrix solve(ll x, ll y, ll n) {
-  matrix in(2);
+template <typename T>
+matrix<T> solve(ll x, ll y, ll n) {
+  matrix<T> in(2);
 
+  // Example
   in[0][0] = x % MOD;
   in[0][1] = y % MOD;
   in[1][0] = 1;
   in[1][1] = 0;
 
-  return fast_pow(in, n);
+  return fast_pow<T>(in, n);
 }
diff --git a/algorithms/math/matrix.cpp b/algorithms/math/matrix.cpp
index ab09b06..9515170 100644
--- a/algorithms/math/matrix.cpp
+++ b/algorithms/math/matrix.cpp
@@ -2,20 +2,21 @@
  * Matrix 
  */
 
+template <typename T>
 struct matrix {
   int r, c;
-  vector<vector<ll>> m;
+  vector<vector<T>> m;
 
   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) {
-    m = vector<vector<ll>>(r, vector<ll>(c, 0));
+    m = vector<vector<T>>(r, vector<T>(c, 0));
   }
 
   matrix operator*(matrix a) {
-    assert(r == a.c && c = a.r);
+    assert(r == a.c && c == a.r);
 
     matrix res(r, c);
     for (int i = 0; i < r; i++)
@@ -47,11 +48,7 @@ struct matrix {
       m[i][i] = 1;
   }
 
-  ll *operator[](int i) {
+  vector<T> &operator[](int i) {
     return m[i];
   }
-
-  void clear() {
-    mset(m, 0);
-  }
 };
-- 
GitLab