Cod sursa(job #2340461)

Utilizator razvanradulescuRadulescu Razvan razvanradulescu Data 10 februarie 2019 14:27:56
Problema Al k-lea termen Fibonacci Scor 45
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.31 kb
#include <iostream>
#include <cstdio>
#define MOD 666013
using namespace std;

struct matrice
{
    long long a[2][2];
    void add(matrice b)
    {
        long long aux[2][2] = {{0, 0}, {0, 0}};
        for(int i = 0; i<2; i++)
        {
            aux[0][0] = (aux[0][0] + (a[i][0] * b.a[0][i])%MOD)%MOD;
            aux[1][0] = (aux[1][0] + (a[i][1] * b.a[0][i])%MOD)%MOD;
            aux[0][1] = (aux[0][1] + (a[i][0] * b.a[1][i])%MOD)%MOD;
            aux[1][1] = (aux[1][1] + (a[i][1] * b.a[1][i])%MOD)%MOD;
        }
        a[0][0] = aux[0][0];
        a[0][1] = aux[0][1];
        a[1][0] = aux[1][0];
        a[1][1] = aux[1][1];
    }
};

matrice m;
matrice r;

void ridLaPutLog(int put)
{
    r.a[0][0] = 1;
    r.a[0][1] = 0;
    r.a[1][0] = 0;
    r.a[1][1] = 1;
    while(put)
    {
        if((put & 1))
        {
            put--;
            r.add(m);
        }
        else
        {
            put/=2;
            m.add(m);
        }
    }
}

long long nr;

void rez()
{
    m.a[0][0] = 0;
    m.a[0][1] = 1;
    m.a[1][0] = 1;
    m.a[1][1] = 1;
    scanf("%lld", &nr);
    ridLaPutLog(nr-2);
    printf("%lld", r.a[0][1]+r.a[1][1]);
}

int main()
{
    freopen("kfib.in", "r", stdin);
    freopen("kfib.out", "w", stdout);
    rez();
    return 0;
}