Cod sursa(job #1774864)

Utilizator din99danyMatei Daniel din99dany Data 9 octombrie 2016 15:42:20
Problema Al k-lea termen Fibonacci Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 kb
#include <cstdio>
using namespace std;

#define MOD 666013

int p[ 2 ][ 2 ] = { { 1, 0 },
                    { 0, 1 } };

void ridica ( int n );
void inmultire ( int a[][ 2 ], int b[][  2 ] );

int main () {

    freopen("kfib.in","r",stdin);
    freopen("kfib.out","w",stdout);

    int n;

    scanf("%d",&n);
    ridica( n - 1 );
    printf("%d",p[ 1 ][ 1 ]);

    return 0;

}

void inmultire ( int a[][ 2 ], int b[][  2 ] ) {

    int c[ 2 ][ 2 ] = { { 0, 0 }, { 0, 0 } };
    int i, j, k;

    for ( i = 0; i < 2; ++i ) {
        for ( j = 0; j < 2; ++j ) {
            for ( k = 0; k < 2; ++k ) {
                c[ i ][ j ] += (long long)(1LL*a[ i ][ k ] * b[ k ][ j ]%MOD);
                c[ i ][ j ] %= MOD;
            }
        }
    }

    for ( i = 0; i < 2; ++i )
        for ( j = 0; j < 2; ++j ) a[ i ][ j ] = c[ i ][ j ] % MOD;

}

void ridica ( int n ) {

    int a[ 2 ][ 2 ] = { { 0, 1 },
                        { 1, 1 } };

    while ( n ) {
        if ( n % 2 ) {
            inmultire ( p, a );
            n--;
        }
        inmultire ( a, a );
        n /= 2;
    }

}