Cod sursa(job #2199694)

Utilizator georgeromanGeorge Roman georgeroman Data 28 aprilie 2018 19:06:12
Problema Al k-lea termen Fibonacci Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.03 kb
#include <array>
#include <fstream>

#define MODULO 666013
typedef std::array<std::array<long, 2>, 2> ARR;

ARR matrixMultiply(ARR m, ARR n) {
  ARR nm;
  nm[0][0] = ((m[0][0] % MODULO) * (n[0][0] % MODULO) + (m[0][1] % MODULO) * (n[1][0] % MODULO)) % MODULO;
  nm[0][1] = ((m[0][0] % MODULO) * (n[0][1] % MODULO) + (m[0][1] % MODULO) * (n[1][1] % MODULO)) % MODULO;
  nm[1][0] = ((m[1][0] % MODULO) * (n[0][0] % MODULO) + (m[1][1] % MODULO) * (n[1][0] % MODULO)) % MODULO;
  nm[1][1] = ((m[1][0] % MODULO) * (n[0][1] % MODULO) + (m[1][1] % MODULO) * (n[1][1] % MODULO)) % MODULO;
  return nm;
}

ARR matrixPower(ARR m, unsigned power) {
  if (power == 1) return m;
  if (power % 2 == 0) {
    return matrixPower(matrixMultiply(m, m), power / 2);
  } else {
    return matrixMultiply(m, matrixPower(m, power - 1));
  }
}

int main() {
  std::ifstream in("kfib.in");
  std::ofstream out("kfib.out");

  long k;
  in >> k;

  ARR a;
  a[0][0] = 0;
  a[0][1] = 1;
  a[1][0] = 1;
  a[1][1] = 1;

  a = matrixPower(a, k - 1);
  out << a[1][1];
  return 0;
}