Cod sursa(job #2293251)

Utilizator dianamichesaRosu Diana Michesa dianamichesa Data 30 noiembrie 2018 18:01:45
Problema Al k-lea termen Fibonacci Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.22 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("kfib.in");
ofstream g("kfib.out");
struct matrice {
    long long m[4][4];
};
const int MOD = 666013;
int k;
matrice inm (matrice a, matrice b) {
    matrice c;
    c.m[1][1] = c.m[1][2] = c.m[2][1] = c.m[2][2] = 0;
    c.m[1][1] = ((a.m[1][1] * b.m[1][1]) + (a.m[1][2] * b.m[2][1])) % MOD;
    c.m[1][2] = ((a.m[1][1] * b.m[1][2]) + (a.m[1][2] * b.m[2][2])) % MOD;
    c.m[2][1] = ((a.m[1][1] * b.m[2][1]) + (a.m[2][2] * b.m[2][1])) % MOD;
    c.m[2][2] = ((a.m[1][2] * b.m[2][1]) + (a.m[2][2] * b.m[2][2])) % MOD;
    return c;
}
void putere (matrice &a, int b) {
    matrice rez, ak = a;
    rez.m[1][2] = rez.m[2][1] = 0;
    rez.m[1][1] = rez.m[2][2] = 1;
    while (b) {
        if (b % 2)
            rez = inm(rez, ak);
        ak = inm(ak, ak);
        b /= 2;
    }
    a = rez;
}
void afisare (matrice a) {
    g << a.m[1][1] << ' ' << a.m[1][2] << '\n';
    g << a.m[2][1] << ' ' << a.m[2][2] << '\n';
    g << '\n';
}
int main()
{
    f >> k;
    matrice a;
    //initializare(a);
    a.m[1][1] = 0;
    a.m[1][2] = 1;
    a.m[2][1] = 1;
    a.m[2][2] = 1;
    putere (a, k - 1);
    g << a.m[2][2];
    return 0;
}