Cod sursa(job #1799060)

Utilizator calin9819Costea Calin calin9819 Data 5 noiembrie 2016 18:37:36
Problema Al k-lea termen Fibonacci Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.01 kb
#include <iostream>
#include <fstream>
using namespace std;

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

const int MOD = 666013;
int k;

struct matrice{
    long long int a, b, c, d;

} m, z, I2;


matrice inmultire(matrice m1, matrice m2) {
    matrice r;
    r.a = ((m1.a * m2.a) % MOD + (m1.b * m2.c) % MOD) % MOD;
    r.b = ((m1.a * m2.b) % MOD + (m1.b * m2.d) % MOD) % MOD;
    r.c = ((m1.c * m2.a) % MOD + (m1.d * m2.c) % MOD) % MOD;
    r.d = ((m1.c * m2.b) % MOD + (m1.d * m2.d) % MOD) % MOD;
    return r;
}

matrice putere(matrice &m, int k) {
    matrice n = I2;
    while (k > 0)
        if (k % 2 == 0) {
            z = inmultire(z, z);
            k /= 2;
        }
        else {
            n = inmultire(n, z);
            k--;
        }
    return n;
}

int main()
{
    f >> k;
    m.a = 0; m.b = 1; m.c = 1; m.d = 1;
    z.a = 0; z.b = 1; z.c = 1; z.d = 1;
    I2.a = I2.d = 1;
    I2.b = I2.c = 0;
    m = putere(m, k - 1);
    g << m.d;
    return 0;
}