Cod sursa(job #2877668)

Utilizator NanuGrancea Alexandru Nanu Data 25 martie 2022 10:08:30
Problema Al k-lea termen Fibonacci Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.01 kb
#include <fstream>
#include <algorithm>
using namespace std;

ifstream fin("kfib.in");
ofstream fout("kfib.out");

#define MOD 666013

int k;
int a[2][2] = {{1, 1}, {1, 0}}, b[2][2], c[2][2];

static inline void Produs(int a[2][2], int b[2][2]) {
  for(int i = 0; i < 2; i++)
    for(int j = 0; j < 2; j++)
      c[i][j] = 0;

  for(int i = 0; i < 2; i++) 
    for(int j = 0; j < 2; j++) 
      for(int k = 0; k < 2; k++)
        c[i][j] += (1LL * a[i][k] * b[k][j]) % MOD;

  for(int i = 0; i < 2; i++)
    for(int j = 0; j < 2; j++)
      a[i][j] = c[i][j];
}

static inline void putere(int a[2][2], int y) {
  int rez[2][2] = {{1, 0}, {0, 1}};       //matricea I2 
  while(y > 0) {
    if(y % 2 == 1)
      Produs(rez, a);
    y >>= 1;
    Produs(a, a);
  }
  for(int i = 0; i < 2; i++)
    for(int j = 0; j < 2; j++)
      a[i][j] = rez[i][j];
}

int main() {
  fin >> k;

  putere(a, k - 1);

  b[0][0] = 1;
  b[1][0] = 0;
  Produs(a, b);

  fout << a[0][0];

  return 0;
}