Cod sursa(job #2674639)

Utilizator Razvan48Capatina Razvan Nicolae Razvan48 Data 19 noiembrie 2020 19:02:53
Problema Al k-lea termen Fibonacci Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.19 kb
#include <fstream>
using namespace std;

const long long MODULO = 666013;

long long fibo[2] = {1, 1};

long long fibo_copie[2] = {1, 1};

long long mat_rez[4] = {1, 0, 0, 1};

long long mat_a[4] = {0, 1, 1, 1};

long long mat_rez_copie[4];

long long mat_a_copie[4];

int main()
{
    ifstream in("kfib.in");
    ofstream out("kfib.out");

    long long k;
    in >> k;

    if (k == 0)
    {
        out << 0;
        return 0;
    }
    if (k == 1 || k == 2)
    {
        out << 1;
        return 0;
    }

    k -= 2;

    while (k)
    {
        if (k % 2)
        {
            mat_rez_copie[0] = mat_rez[0];
            mat_rez_copie[1] = mat_rez[1];
            mat_rez_copie[2] = mat_rez[2];
            mat_rez_copie[3] = mat_rez[3];

            mat_rez[0] = ((mat_rez_copie[0] * mat_a[0]) % MODULO + (mat_rez_copie[1] * mat_a[2]) % MODULO) % MODULO;
            mat_rez[1] = ((mat_rez_copie[0] * mat_a[1]) % MODULO + (mat_rez_copie[1] * mat_a[3]) % MODULO) % MODULO;
            mat_rez[2] = ((mat_rez_copie[2] * mat_a[0]) % MODULO + (mat_rez_copie[3] * mat_a[2]) % MODULO) % MODULO;
            mat_rez[3] = ((mat_rez_copie[2] * mat_a[1]) % MODULO + (mat_rez_copie[3] * mat_a[3]) % MODULO) % MODULO;
        }

        mat_a_copie[0] = mat_a[0];
        mat_a_copie[1] = mat_a[1];
        mat_a_copie[2] = mat_a[2];
        mat_a_copie[3] = mat_a[3];

        mat_a[0] = ((mat_a_copie[0] * mat_a_copie[0]) % MODULO + (mat_a_copie[1] * mat_a_copie[2]) % MODULO) % MODULO;
        mat_a[1] = ((mat_a_copie[0] * mat_a_copie[1]) % MODULO + (mat_a_copie[1] * mat_a_copie[3]) % MODULO) % MODULO;
        mat_a[2] = ((mat_a_copie[2] * mat_a_copie[0]) % MODULO + (mat_a_copie[3] * mat_a_copie[2]) % MODULO) % MODULO;
        mat_a[3] = ((mat_a_copie[2] * mat_a_copie[1]) % MODULO + (mat_a_copie[3] * mat_a_copie[3]) % MODULO) % MODULO;

        k /= 2;
    }

    fibo_copie[0] = fibo[0];
    fibo_copie[1] = fibo[1];

    fibo[0] = ((fibo_copie[0] * mat_rez[0]) % MODULO + (fibo_copie[1] * mat_rez[2]) % MODULO) % MODULO;
    fibo[1] = ((fibo_copie[0] * mat_rez[1]) % MODULO + (fibo_copie[1] * mat_rez[3]) % MODULO) % MODULO;

    out << fibo[1];

    return 0;
}