Cod sursa(job #2201310)

Utilizator MattCMatei Coroiu MattC Data 4 mai 2018 10:40:13
Problema Al k-lea termen Fibonacci Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.88 kb
#include <iostream>
#include <fstream>
#include <cassert>
#include <algorithm>
#include <cstring>

using namespace std;

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

void mul(int A[2][2], int B[2][2]) {
    int C[2][2];

    for (int i = 0; i < 2; ++ i) {
        for (int j = 0; j < 2; ++ j) {
            C[i][j] = 0;
            for (int k = 0; k < 2; ++ k)
                C[i][j] = (C[i][j] + ((((long long) A[i][k]) * B[k][j]) % 666013LL)) % 666013;
        }
    }
    memcpy(A, C, sizeof C);
}

void f(int Z[2][2], int K) {
    int R[2][2] = {{1, 0}, {0, 1}};

    for (int i = 30; i >= 0; -- i) {
        mul(R, R);
        if ((K >> i) & 1)
            mul(R, Z);
    }
    memcpy(Z, R, sizeof R);
}

int main(){
    int K;
    fin >> K;
    int Z[2][2] = {{0, 1}, {1, 1}};
    f(Z, K - 1);
    fout << Z[1][1] << '\n';
    return 0;
}