Cod sursa(job #2336044)

Utilizator armandpredaPreda Armand armandpreda Data 4 februarie 2019 18:53:57
Problema Al k-lea termen Fibonacci Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.97 kb
#include <iostream>
#include <cstdio>
#define MOD 666013
using namespace std;

void inmultire(int a[2][2], int b[2][2])
{
    int aux[2][2];
    aux[0][0] = (1ll * a[0][0] * b[0][0] + 1ll * a[0][1] * b[1][0]) % MOD;
    aux[0][1] = (1ll * a[0][0] * b[0][1] + 1ll * a[0][1] * b[1][1]) % MOD;
    aux[1][0] = (1ll * a[1][0] * b[0][0] + 1ll * a[1][1] * b[1][0]) % MOD;
    aux[1][1] = (1ll * a[1][0] * b[0][1] + 1ll * a[1][1] * b[1][1]) % MOD;
    a[0][0] = aux[0][0];
    a[1][0] = aux[1][0];
    a[0][1] = aux[0][1];
    a[1][1] = aux[1][1];
}

int main()
{
    freopen("kfib.in", "r", stdin);
    freopen("kfib.out", "w", stdout);
    int A[2][2] = {{1,1}, {1,0}};
    int rez[2][2] = {{1,0}, {0,1}};
    int k;
    scanf("%d", &k);
    k--;
    int mask = 1;
    for (; mask <= k; mask <<= 1)
    {
        if (mask & k)
        {
            inmultire(rez, A);
        }
        inmultire(A, A);
    }
    printf("%d\n", rez[0][0]);
    return 0;
}