Cod sursa(job #2043137)

Utilizator Andreiii500Andrei Puiu Andreiii500 Data 19 octombrie 2017 17:46:49
Problema Al k-lea termen Fibonacci Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.04 kb
#include<iostream>
#include<fstream>
using namespace std;

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

long long MOD = 666013;

struct matrice
{
    long long a=0,b=1;
    long long c=1,d=1;
};

matrice SMALLEST_MATRIX;
matrice produsMatrice(matrice A, matrice B)
{
    matrice C;
    C.a = (A.a * B.a + A.b * B.c) % MOD;
    C.b = (A.a * B.b + A.b * B.d) % MOD;
    C.c = (A.c * B.a + A.d * B.c) % MOD;
    C.d = (A.c * B.b + A.d * B.d) % MOD;

    return C;
}

matrice pow(matrice base, long long exp)
{
    //cout<<base<<" "<<exp<<"\n";
    if(exp == 0) return SMALLEST_MATRIX;
    if(exp == 1) return base;

    if(exp%2 == 1)
        return produsMatrice(pow(produsMatrice(base, base), exp/2), base);
    else if(exp%2 == 0)
        return pow((produsMatrice(base, base)), exp/2);
}

int main()
{
    long long n;

    in>>n;
    ///n = 2707124;
    --n;
    matrice SOL = pow(SMALLEST_MATRIX, n);

    cout<<SOL.a<<" "<<SOL.b<<"\n";
    cout<<SOL.c<<" "<<SOL.d<<"\n";
    out<<SOL.d;

    return 0;
}