Cod sursa(job #612930)

Utilizator marcelcodreaCodrea Marcel marcelcodrea Data 13 septembrie 2011 16:20:37
Problema Al k-lea termen Fibonacci Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 kb
#include <fstream>
#define MODUL 666013
using namespace std;

ifstream f("kfib.in");
ofstream g("kfib.out");
int n;
int Zet[3][3];
int baza2[100];
int Res[3][3];
void precomp() {
    Zet[1][1] = 0;
    Zet[1][2] = 1;
    Zet[2][1] = 1;
    Zet[2][2] = 1;
    Res[1][1] = 1;
    Res[2][2] = 1;
}
void matrixProduct(int A[3][3], int B[3][3]) {
    int InterMed[3][3];
    for(int i = 1; i <= 2; i++)
     for(int j = 1; j <= 2; j++) {
         int sum = (((1LL * A[i][1] * B[1][j]) % MODUL) + ((1LL * A[i][2] * B[2][j]) % MODUL)) % MODUL;
         InterMed[i][j] = sum;
     }
     for(int i = 1; i <= 2; i++)
      for(int j = 1; j <= 2; j++) {
          Res[i][j] = InterMed[i][j];
      }
}
void descompune(int nr) {
    while(nr) {
        baza2[++baza2[0]] = nr % 2;
        nr /= 2;
    }
}
void solve(int n) {
    descompune(n - 1);
    for(int i = baza2[0]; i > 0; i--) {
        matrixProduct(Res, Res);
        if(baza2[i] == 1)
            matrixProduct(Res, Zet);
    }
    g << Res[2][2] % MODUL;
}
int main()
{
    precomp();
    f >> n;
    solve(n);
    return 0;
}