Cod sursa(job #1318484)

Utilizator retrogradLucian Bicsi retrograd Data 15 ianuarie 2015 23:42:27
Problema Al k-lea termen Fibonacci Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.96 kb
#include<fstream>
#include<cmath>

using namespace std;

typedef int64_t var;

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

const var MOD = 666013;
//MATRICEA ESTE:
/*
| 1 1 |
| 1 0 |
*/

var KEY[2][2] = {{1, 1}, {1, 0}}, RES[2][2] = {{1, 0}, {0, 1}};

var r1, r2, r3, r4;

void inmult(var K[2][2], var L[2][2], var R[2][2]) {
    r1 = K[0][0]*L[0][0] + K[0][1]*L[1][0];
    r2 = K[0][0]*L[0][1] + K[0][1]*L[1][1];
    r3 = K[1][0]*L[0][0] + K[1][1]*L[1][0];
    r4 = K[1][0]*L[0][1] + K[1][1]*L[1][1];

    r1 %= MOD; r2 %= MOD; r3 %= MOD; r4 %= MOD;

    R[0][0] = r1; R[0][1] = r2;
    R[1][0] = r3; R[1][1] = r4;
}

void pow(var K[2][2], var n) {
    while(n) {
        if(n%2) {
            inmult(K, RES, RES);
            n --;
        }
        else {
            inmult(K, K, K);
            n /= 2;
        }
    }
}

int main() {
    var K;
    fin>>K;
    pow(KEY, K-1);
    fout<<( RES[1][0] + RES[1][1] ) % MOD;
}