Cod sursa(job #1340740)

Utilizator somuBanil Ardej somu Data 11 februarie 2015 23:50:02
Problema Al k-lea termen Fibonacci Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.87 kb
#include <iostream>
#include <fstream>
#include <cmath>
#define ll long long
#define mod 666013

using namespace std;

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

ll k;

struct Matrix {
    ll a, b, c, d;
};

Matrix atribuie(ll a, ll b, ll c, ll d) {
    Matrix A;
    A.a = a;
    A.b = b;
    A.c = c;
    A.d = d;
    return A;
}

Matrix produs(Matrix A, Matrix B) {
    return atribuie((A.a * B.a + A.b * B.c) % mod, (A.a * B.b + A.b * B.d) % mod, (A.c * B.a + A.d * B.c) % mod, (A.c * B.b + A.d * B.d) % mod);
}

Matrix power(Matrix A, ll p) {
    if (p == 1)
        return A;
    Matrix half = power(A, p/2);
    if (p % 2 == 0)
        return produs(half, half);
    else
        return produs(produs(half, half), A);
}

int main() {
    
    fin >> k;
    fout << power(atribuie(0, 1, 1, 1), k-1).d << "\n";
    
    fin.close();
    fout.close();
    
    return 0;
}