Cod sursa(job #2535908)

Utilizator Tudor06MusatTudor Tudor06 Data 1 februarie 2020 12:39:01
Problema Al k-lea termen Fibonacci Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.29 kb
#include <iostream>
#include <fstream>

using namespace std;

const int MOD = 666013;

long long A[2][2] = { { 0, 1 }, { 1, 1 } };
long long B[2][2] = { { 0, 1 }, { 1, 1 } };
long long C[2][2];


void product( long long A[2][2], long long B[2][2] ) {
    C[0][0] = ( A[0][0] * B[0][0] + A[0][1] * B[1][0] ) % MOD;
    C[0][1] = ( A[0][0] * B[0][1] + A[0][1] * B[1][1] ) % MOD;
    C[1][0] = ( A[1][0] * B[0][0] + A[1][1] * B[1][0] ) % MOD;
    C[1][1] = ( A[1][0] * B[0][1] + A[1][1] * B[1][1] ) % MOD;
}

void copiere( long long A[2][2], long long B[2][2] ) {
    int l, c;
    for ( l = 0; l < 2; l ++ ) {
        for ( c = 0; c < 2; c ++ )
            A[l][c] = B[l][c];
    }
}
void afisare( int A[2][2] ) {
    int l, c;
    for ( l = 0; l < 2; l ++ ) {
        for ( c = 0; c < 2; c ++ )
            cout << A[l][c] << ' ';
        cout << '\n';
    }
    cout << '\n';
}
void exponentiere( int n ) {
    while ( n > 0 ) {
        if ( n % 2 == 1 ) {
            product( A, B );
            copiere( B, C );
        }
        n /= 2;
        product( A, A );
        copiere( A, C );
    }
}

int main() {
    ifstream fin( "kfib.in" );
    ofstream fout( "kfib.out" );
    int n;
    fin >> n;
    exponentiere( n - 1 );
    fout << B[0][1];
    return 0;
}