Cod sursa(job #2466124)

Utilizator ZenoTeodor Anitoaei Zeno Data 1 octombrie 2019 16:19:28
Problema Al k-lea termen Fibonacci Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.37 kb
#include <bits/stdc++.h>
#define NMAX 100001

#define MOD 666013

typedef unsigned long long ull;

using namespace std;

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

int t;
int a, b;

void copyMat(int dest[][2], int src[][2])
{
    for(int i = 0; i < 2; i++)
        for(int j = 0; j < 2; j++)
            dest[i][j] = src[i][j];
}

void matMul2x2(int a[][2], int b[][2], int res[][2])
{
    res[0][0] = ((ull)a[0][0] * b[0][0] % MOD + (ull)a[0][1] * b[1][0] % MOD) % MOD;
    res[0][1] = ((ull)a[0][0] * b[0][1] % MOD + (ull)a[0][1] * b[1][1] % MOD) % MOD;
    res[1][0] = ((ull)a[1][0] * b[0][0] % MOD + (ull)a[1][1] * b[1][0] % MOD) % MOD;
    res[1][1] = ((ull)a[1][0] * b[0][1] % MOD + (ull)a[1][1] * b[1][1] % MOD) % MOD;
}

int getFib(int n)
{
    int base[][2] = {{0, 1}, {1, 1}};
    int fib[][2] = {{1, 0}, {0, 1}};
    int aux[2][2];

    while(n)
    {
        if(n & 1)
        {
            matMul2x2(base, fib, aux);
            copyMat(fib, aux);
        }

        n >>= 1;
        matMul2x2(base, base, aux);
        copyMat(base, aux);
    }

    return fib[0][1];
}

int main()
{
/*
    fin >> t;
    while(t--)
    {
        fin >> a >> b;

        fout << ((ull)getFib(b + 2) - (ull)getFib(a + 1) + MOD) % MOD << '\n';
    }
*/

    int k;
    fin >> k;
    fout << getFib(k) << '\n';

    return 0;
}