Cod sursa(job #2931251)

Utilizator victorzarzuZarzu Victor victorzarzu Data 30 octombrie 2022 18:52:10
Problema Al k-lea termen Fibonacci Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.05 kb
#include <bits/stdc++.h>

#define N 50005
#define oo 0x3f3f3f3f

using namespace std;
ifstream f("kfib.in");
ofstream g("kfib.out");
int n;

void multiply(int a[2][2], int b[2][2], int c[2][2]) {
  for(int k = 0;k < 2;++k) {
    for(int i = 0;i < 2;++i) {
      for(int j = 0;j < n;++j) {
        c[i][j] += a[i][k] * b[k][j];
      }
    }
  }
}

void copy(int a[2][2], int b[2][2]) {
  for(int i = 0;i < 2;++i) {
    for(int j = 0;j < 2;++j) {
      b[i][j] = a[i][j];
    }
  }
}

void solve(int n) {
  int rez[2][2] = {{1, 1}, {0, 0}};
  int use[2][2] = {{0, 1}, {1, 1}};
  int temp[2][2];
  int log[2][2] = {{1, 0}, {0, 1}};

  for(int i = 1;(1 << i) <= n;++i) {
    if((1 << i) & n) {
      memset(temp, 0, sizeof(temp));
      multiply(log, use, temp);
      copy(temp, log);
    }

    memset(temp, 0, sizeof(temp));
    multiply(use, use, temp);
    copy(temp, use);
  }
  
  memset(temp, 0, sizeof(temp));
  multiply(rez, log, temp);
  g<<temp[0][1]<<'\n';
}

int main() {
  f>>n;
  solve(n - 2);
  return 0;
}