Cod sursa(job #3228074)

Utilizator alexxiacrisanCrisan Maria - Alexia alexxiacrisan Data 5 mai 2024 14:27:15
Problema Al k-lea termen Fibonacci Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.6 kb
#include <iostream>
#include <fstream>

using namespace std;

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

#define mod 666013

void fura_valoarea(int A[2][2], int B[2][2])
{
    int i, j;
    for (i = 0; i < 2; i++)
        for (j = 0; j < 2; j++)
            A[i][j] = B[i][j];
}

void inmultire_matrice(int A[2][2], int B[2][2], int rez[2][2])
{
    rez[0][0] = ((1LL * A[0][0] * B[0][0]) % mod +  (1LL * A[0][1] * B[1][0]) % mod) % mod;
    rez[0][1] = ((1LL * A[0][0] * B[0][1]) % mod +  (1LL * A[0][1] * B[1][1]) % mod) % mod;
    rez[1][0] = ((1LL * A[1][0] * B[0][0]) % mod +  (1LL * A[1][1] * B[1][0]) % mod) % mod;
    rez[1][1] = ((1LL * A[1][0] * B[0][1]) % mod +  (1LL * A[1][1] * B[1][1]) % mod) % mod;
}


void expo(int baza[2][2], int exp, int solutie[2][2])
{
    int acc[2][2] = {{1, 0}, {0, 1}}, aux[2][2] = {{1, 0}, {0, 1}};

    if(exp < 0)
        solutie[1][1] = 0;
    else if(exp == 0)
        solutie[1][1] = 1;
    else if(exp == 1)
        fura_valoarea(solutie, baza);
    else
    {
        fura_valoarea(acc, baza);
        for (int i = 1; i <= exp; i *= 2)
        {
            if ((i & exp))
            {
                inmultire_matrice(solutie, acc, aux);
                fura_valoarea(solutie, aux);
            }
            inmultire_matrice(acc, acc, aux);
            fura_valoarea(acc, aux);
        }
    }
}

int main()
{
    int Z[2][2], indice, Z_i[2][2] = {{1, 0}, {0, 1}}, M_i[1][2];
    Z[0][0] = 0; Z[0][1] = 1; Z[1][0] = 1; Z[1][1] = 1;

    fin>>indice;
    expo(Z, indice-1, Z_i);
    fout<<Z_i[1][1];
    return 0;
}