Cod sursa(job #2186920)

Utilizator LivcristiTerebes Liviu Livcristi Data 26 martie 2018 08:46:40
Problema Al k-lea termen Fibonacci Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include <iostream>
#include <fstream>
#define MOD 666013
using namespace std;
int fib(int n);
void putere(int f[2][2], int n);
void inmultire(int f[2][2], int m[2][2]);
int fib(int n)
{
    /*
    1 1
    1 0
    */
    int f[2][2] = {{1, 1},{1, 0}};
    if(n == 0)
        return 0;
    putere(f, n - 1);
    return f[0][0] % MOD;
}
void putere(int f[2][2], int n)
{
    if(n == 0 || n == 1)
        return;
    int m[2][2] = {{1, 1},{1, 0}};
    putere(f, n / 2);
    inmultire(f, f);
    if(n % 2)
        inmultire(f, m);
}
void inmultire(int f[2][2], int m[2][2])
{
    int a = (1LL * f[0][0] * m[0][0]) % MOD + (1LL * f[0][1] * m[1][0]) % MOD;
    int b = (1LL * f[0][0] * m[0][1]) % MOD + (1LL * f[0][1] * m[1][1]) % MOD;
    int c = (1LL * f[1][0] * m[0][0]) % MOD + (1LL * f[1][1] * m[1][0]) % MOD;
    int d = (1LL * f[1][0] * m[0][1]) % MOD + (1LL * f[1][1] * m[1][1]) % MOD;

    f[0][0] = a % MOD;
    f[0][1] = b % MOD;
    f[1][0] = c % MOD;
    f[1][1] = d % MOD;
}
int main()
{
    int n;
    ifstream f("kfib.in");
    ofstream g("kfib.out");
    f >> n;
    g << fib(n);
    f.close();
    g.close();
}