Cod sursa(job #1807206)

Utilizator fluture.godlikeGafton Mihnea Alexandru fluture.godlike Data 16 noiembrie 2016 10:08:52
Problema Al k-lea termen Fibonacci Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.45 kb
/// Problema "Kfib" - InfoArena
#include <cstdio>
#include <algorithm>

#define in "kfib.in"
#define out "kfib.out"
#define MOD 666013

using namespace std;
struct matrice
{
    int mat[3][3];
} aux, null, ans, ceva;
int n;

inline void init()
{
    aux.mat[1][1] = 0;
    aux.mat[1][2] = 1;
    aux.mat[2][1] = 1;
    aux.mat[2][2] = 1;
    null.mat[1][1] = 1;
    null.mat[1][2] = 0;
    null.mat[2][1] = 0;
    null.mat[2][2] = 1;
}
matrice inmultire(const matrice &M1, const matrice &M2)
{
    matrice sol;
    for(int i = 1; i<= 2; ++i)
    {
        for(int j = 1; j<= 2; ++j)
        {
            sol.mat[i][j] = 0;
            for(int k = 1; k<= 2; ++k)
            {
                sol.mat[i][j] = (sol.mat[i][j] + 1LL*M1.mat[i][k]*M2.mat[k][j])%MOD;
            }
        }
    }
    return sol;
}
matrice power(const matrice &base, const int &Exp)
{
    matrice sol = null, tmp = base;
    int pw = Exp;
    for( ; pw; pw>>=1)
    {
        if(pw&1)
        {
            sol = inmultire(sol, tmp);
        }
        tmp = inmultire(tmp, tmp);
    }
    return sol;
}

int main()
{
    freopen(in, "r", stdin);
    freopen(out, "w", stdout);
    scanf("%d", &n);
    init();
    if(n == 0) {printf("0\n");return 0;}
    if(n == 1) {printf("1\n");return 0;}
    if(n == 2) {printf("1\n");return 0;}
    ans = power(aux, n-2);
    printf("%d\n", (ans.mat[1][2] + ans.mat[2][2]) % MOD);
    return 0;
}