Cod sursa(job #2895290)

Utilizator DorianPop12Dorian Pop DorianPop12 Data 28 aprilie 2022 21:33:39
Problema Al k-lea termen Fibonacci Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.12 kb
#include <fstream>
#include <iostream>
using namespace std;

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

void multiply(unsigned long long F[2][2], unsigned long long M[2][2], int MOD) {
   unsigned long long a = ((F[0][0] * M[0][0])%MOD + (F[0][1] * M[1][0])%MOD)%MOD;
   unsigned long long b= ((F[0][0] * M[0][1])%MOD + (F[0][1] * M[1][1])%MOD)%MOD;
   unsigned long long c = ((F[1][0] * M[0][0])%MOD + (F[1][1] * M[1][0])%MOD)%MOD;
   unsigned long long d = ((F[1][0] * M[0][1])%MOD + (F[1][1] * M[1][1])%MOD)%MOD;
   F[0][0] = a;
   F[0][1] = b;
   F[1][0] = c;
   F[1][1] = d;
}
void power(unsigned long long F[2][2], int n, int MOD) {
   if (n == 0 || n == 1)
      return;

   unsigned long long M[2][2] = {{1,1},{1,0}};
   power(F, n / 2, MOD);
   multiply(F, F, MOD);
   if (n % 2 != 0)
      multiply(F, M, MOD);
}
unsigned long long fibo(int n, int MOD) {
   unsigned long long F[2][2] = {{1,1},{1,0}};
   if (n == 0)
      return 0;
   power(F, n - 1, MOD);
   return F[0][0];
}
int main() {
   unsigned long long n, k, p, s=0, MOD = 666013;
   fin>>k;
   fout<<fibo(k, MOD);
   return 0;
}