Cod sursa(job #1841281)

Utilizator stefanmereutaStefan Mereuta stefanmereuta Data 5 ianuarie 2017 14:46:14
Problema Al k-lea termen Fibonacci Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include <iostream>
#include <fstream>
#include <stdio.h>

using namespace std;

#define MOD 666013

void inmultire(int a[2][2], int b[2][2]) {
    int res[2][2];

    res[0][0] = ((long long) a[0][0] * b[0][0] + (long long) a[0][1] * b[1][0]) % MOD;
    res[0][1] = ((long long) a[0][0] * b[0][1] + (long long) a[0][1] * b[1][1]) % MOD;
    res[1][0] = ((long long) a[1][0] * b[0][0] + (long long) a[1][1] * b[1][0]) % MOD;
    res[1][1] = ((long long) a[1][0] * b[0][1] + (long long) a[1][1] * b[1][1]) % MOD;

    for (int i = 0; i < 2; i++) {
        for (int j = 0; j < 2; j++) {
            a[i][j] = res[i][j];
        }
    }
}

void putere(int a[2][2], int put) {
    if (put == 1) {
        return;
    } else if (put % 2 == 1) {
        int b[2][2] = {{0, 1}, {1, 1}};
        putere(a, put - 1);
        inmultire(a, b);
        return;
    } else {
        putere(a, put / 2);
        inmultire(a, a);
    }
}

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

    int a[2][2] = {{0, 1}, {1, 1}}, k;

    fin >> k;

    putere(a, k - 1);

    fout << a[1][1];

    fin.close();
    fout.close();

    return 0;
}