Cod sursa(job #2261810)

Utilizator flibiaVisanu Cristian flibia Data 16 octombrie 2018 18:35:07
Problema Al k-lea termen Fibonacci Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.87 kb
#include <bits/stdc++.h>
#define mod 666013
#define ll long long

using namespace std;

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

int k;

void mul(ll a[2][2], ll b[2][2]){
    ll p[2][2];
    p[0][0] = a[0][0] * b[0][0] + a[0][1] * b[1][0];
    p[0][1] = a[0][0] * b[0][1] + a[0][1] * b[1][1];
    p[1][0] = a[1][0] * b[0][0] + a[1][1] * b[1][0];
    p[1][1] = a[1][0] * b[0][1] + a[1][1] * b[1][1];
    for(int i = 0; i < 2; i++)
        for(int j = 0; j < 2; j++)
            p[i][j] %= mod;
    memcpy(a, p, sizeof p);
}

ll lg(int k){
    if(k < 2)
        return k;
    k--;
    ll mat[2][2] = {0, 1, 1, 1};
    ll aux[2][2] = {0, 1, 1, 1};
    while(k){
        if(k & 1)
            mul(mat, aux);
        mul(aux, aux);
        k >>= 1;
    }
    return mat[1][0];
}

int main(){
    in >> k;
    out << lg(k);
    return 0;
}