Cod sursa(job #2723697)

Utilizator Florinos123Gaina Florin Florinos123 Data 15 martie 2021 12:39:38
Problema Al k-lea termen Fibonacci Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.57 kb
#include <fstream>
#include <cstring>

using namespace std;

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

int n;

int a[3][3];

int aux[3][3];

const int mod = 666013;

void Multiply (int a[3][3], int b[3][3])
{
    bool ok = false;

    for (int i=1; i<=2; i++)
    {
        for (int j=1; j<=2; j++)
        {
            if (a[i][j] != 0)
                ok = true;
        }
    }

    if (!ok)
    {
        for (int i=1; i<=2; i++)
        {
            for (int j=1; j<=2; j++)
            {
                a[i][j] = b[i][j];
            }
        }
    }
    else
    {
        int c[3][3];
        memset(c, 0, sizeof(c));

        for (int i=1; i<=2; i++)
        {
            for (int j=1; j<=2; j++)
            {
                for (int k=1; k<=2; k++)
                {
                    c[i][j] = (1LL * c[i][j] + (1LL * a[i][k] * b[k][j]) % mod) % mod;
                }
            }
        }

        for (int i=1; i<=2; i++)
        {
            for (int j=1; j<=2; j++)
            {
                a[i][j] = c[i][j];
            }
        }
    }
}

void RidicareLog (int p)
{
    while (p)
    {
        if (p % 2 == 1)
           Multiply(aux, a);
        Multiply(a, a);
        p /= 2;
    }
}

int main()
{
    f >> n;
    if (n == 0 || n == 1)
        g << 1;
    else if (n == 2) g << 2;
    else
    {
        a[1][1] = 0; a[1][2] = 1;
        a[2][1] = 1; a[2][2] = 1;

        RidicareLog (n-2);

        g << (1LL * aux[1][2] + aux[2][2]) % mod;
    }
    return 0;
}