Cod sursa(job #3221515)

Utilizator hutanuHutanu Andrei hutanu Data 7 aprilie 2024 12:26:54
Problema Al k-lea termen Fibonacci Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.18 kb
#include <fstream>
#define MOD 666013

using namespace std;

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

void produs(long long int a[2][2], long long int b[2][2])
{
    int i, j, k;
    long long int aux[2][2] = {0};
    for(i = 0; i < 2; i++)
        for(j = 0; j < 2; j++)
            for(k = 0; k < 2; k++)
                aux[i][j] = (aux[i][j] + (a[i][k] * b[k][j]) % MOD) % MOD;
    for(i = 0; i < 2; i++)
        for(j = 0; j < 2; j++)
            a[i][j] = aux[i][j];
}

void putere(long long int rez[2][2], long long int mat[2][2], long long int k)
{
    while(k)
    {
        if(k % 2 == 1)
            produs(rez, mat);
        produs(mat, mat);
        k = k / 2;
    }
}

int main()
{
    int i, j, k;
    fin >> k;
    long long int mat[2][2] = {{1, 1}, {1, 0}};
    long long int rez[2][2] = {{1, 0}, {0, 1}};
    long long int baza[2][1] = {{1}, {0}};
    putere(rez, mat, k - 1);
    long long int aux[2][1] = {0};
    for(i = 0; i < 2; i++)
        for(j = 0; j < 1; j++)
            for(k = 0; k < 2; k++)
                aux[i][j] = (aux[i][j] + (rez[i][k] * baza[k][j]) % MOD) % MOD;
    fout << aux[0][0] << '\n';
    return 0;
}