Cod sursa(job #2398850)

Utilizator alexalghisiAlghisi Alessandro Paolo alexalghisi Data 6 aprilie 2019 12:10:22
Problema Al k-lea termen Fibonacci Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.01 kb
#include <bits/stdc++.h>
#define MOD 666013
using namespace std;
struct matrice
{
    unsigned long long a11, a12, a21, a22;
}A;
matrice inmultire(matrice A, matrice B)
{
    matrice C;
    C.a11 = (A.a11 * B.a11 + A.a12 * B.a21) % MOD;
    C.a12 = (A.a11 * B.a12 + A.a12 * B.a22) % MOD;
    C.a21 = (A.a21 * B.a11 + A.a22 * B.a21) % MOD;
    C.a22 = (A.a21 * B.a12 + A.a22 * B.a22) % MOD;
    return C;
}
matrice putere(matrice A, int k)
{
    if(k == 1)return A;
    if(k % 2 == 0)
    {
        matrice C = putere(A, k / 2);
        return inmultire(C, C);
    }
    if(k % 2 == 1)
    {
        matrice C = putere(A, k / 2);
        return inmultire(inmultire(C, C), A);
    }
}
int fibonacci(int k)
{
    if(k == 0)return 0;
    if(k == 1)return 1;
    else
    {
        matrice B = putere(A, k - 2);
        return B.a12 + B.a22;
    }
}
int k;
int main()
{
    ifstream f("kfib.in");
    ofstream g("kfib.out");
    f >> k;
    A.a11 = 0;
    A.a12 = 1;
    A.a21 = 1;
    A.a22 = 1;
    g << fibonacci(k) % MOD;
    return 0;
}