Cod sursa(job #2822115)

Utilizator BeilandArnoldArnold Beiland BeilandArnold Data 23 decembrie 2021 16:20:18
Problema Al k-lea termen Fibonacci Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.5 kb
#include <fstream>
using namespace std;

const long long MOD = 666013;

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


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


void putere(long long a[2][2], int put, long long rez[2][2])
{
    if (put == 0) {
        rez[0][0] = 1;
        rez[0][1] = 0;
        rez[1][0] = 0;
        rez[1][1] = 1;
    }
    else {
        long long temp[2][2];

        putere(a, put/2, temp);

        inmultire(temp, temp, rez);

        if (put % 2 != 0) {
            copiere(rez, temp);
            inmultire(a, temp, rez);
        }
    }
}


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

    int k;
    fin >> k;

    long long a = 0, b = 1, c = 1;

    if (k == 0) fout << "0\n";
    else if (k == 1) fout << "1\n";
    else {
        k -= 2;
        while (k > 0) {
            a = b;
            b = c;
            c = (a+b) % MOD;
            k--;
        }
        fout << c << endl;
    }

    /*long long A[2][2] = { {0,1}, {1,1} };
    long long B[2][2];

    if (k == 0)
        fout << 0 << '\n';
    else
        putere(A, k-1, B);

    fout << B[1][1] << '\n';*/

    return 0;
}