Cod sursa(job #1571667)

Utilizator justsomedudePalade Thomas-Emanuel justsomedude Data 18 ianuarie 2016 12:26:24
Problema Al k-lea termen Fibonacci Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.07 kb
#include<iostream>
#define MOD 666013
#include<fstream>

using namespace std;

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

long long int P[2][2], X[2][2];
int n;

/// functia care inmulteste doua matrice, fiecare de 2, pe 2 si pune rez in C

void Inmultire(long long int A[2][2], long long int B[2][2], long long int C[2][2])
{
    C[0][0] = A[0][0] * B[0][0] + A[0][1] * B[1][0];
    C[0][1] = A[0][0] * B[0][1] + A[0][1] * B[1][1];
    C[1][0] = A[1][0] * B[0][0] + A[1][1] * B[1][0];
    C[1][1] = A[1][0] * B[0][1] + A[1][1] * B[1][1];
}

void Putere(int n)
{
     // X-ul e I2
     X[0][0] = X[1][1] = 1;
     X[0][1] = X[1][0] = 0;
     while (n>0)
     {
        if (n & 1)
        {
            n--;
            Inmultire(X, P, X);
        }
        n >>= 1;
        Inmultire(P, P, P);
     }
    fout << X[1][1] << "\n";
}

int main ()
{
  fin >> n;
  P[0][0] = 0;
  P[0][1] = 1;
  P[1][0] = 1;
  P[1][1] = 1;
  if (n <= 1) fout << n << "\n";
  else          Putere(n-1);
  fin.close();
  fout.close();
  return 0;
}