Cod sursa(job #3124044)

Utilizator AlexTimplaruAlexandru Timplaru AlexTimplaru Data 26 aprilie 2023 18:57:44
Problema Al k-lea termen Fibonacci Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.13 kb
#include <fstream>
#define MOD 666013

using namespace std;

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

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

void copiere(long long a[2][2], long long b[2][2])
{
    for(int i = 0; i < 2; i++)
    {
        for(int j = 0; j < 2; j++)
        {
            b[i][j] = a[i][j];
        }
    }
}

int k;

int main()
{
    fin >> k;

    long long m[2][2] = { {1, 1}, {0, 0} };
    long long z[2][2] = { {0, 1}, {1, 1} };
    long long t[2][2] = { {0, 0}, {0, 0} };

    long long r[2][2] = { {1, 0}, {0, 1} };

    while(k != 0)
    {
        if(k%2)
        {
            inmultire(r, z, t);
            copiere(t, r);
        }
        inmultire(z, z, t);
        copiere(t, z);
        k /= 2;
    }

    fout << r[0][1];

    return 0;
}