Cod sursa(job #3154616)

Utilizator oana75Ioana Prunaru oana75 Data 5 octombrie 2023 13:56:27
Problema Al k-lea termen Fibonacci Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.05 kb
#include <fstream>

using namespace std;
const int MOD = 666013;

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

/// (F0 F1) * Z^i = (Fi Fi+1)

int K, Z[3][3] = {{0, 0, 0}, {0, 0, 1}, {0, 1, 1}};

void copiere(int A[][3], int B[][3])
{
    for (int i = 1; i <= 2; i++)
        for (int j = 1; j <= 2; j++)
            A[i][j] = B[i][j];
}

void inmultire(int A[][3], int B[][3])
{
    int C[3][3], D[3][3];
    copiere(C, A);
    copiere(D, B);
    for (int i = 1; i <= 2; i++)
        for (int j = 1; j <= 2; j++)
        {
            A[i][j] = 0;
            for (int k = 1; k <= 2; k++)
            {
                A[i][j] += (1LL * C[i][k] * D[k][j]) % MOD;
                A[i][j] %= MOD;
            }
        }
            
}

void exponentiere(int n)
{
    int val[3][3] = {{0, 0, 0}, {0, 1, 0}, {0, 0, 1}};
    while (n)
    {
        if (n & 1)
            inmultire(val, Z);
        inmultire(Z, Z);
        n >>= 1;
    }
    copiere(Z, val);
}

int main()
{
    in >> K;
    exponentiere(K);
    out << Z[2][1];
    in.close();
    out.close();
    return 0;
}