Cod sursa(job #409887)

Utilizator ssergiussSergiu-Ioan Ungur ssergiuss Data 3 martie 2010 21:56:23
Problema Al k-lea termen Fibonacci Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.57 kb
#include <algorithm>
using namespace std;

#define MOD 666013

typedef int int_32;
typedef long long int int_64;

int_32 AUX[ 2 ][ 2 ] = { { 0, 1 },
                      { 1, 1 } };

int_32 SOL[ 2 ][ 2 ] = { { 1, 0 },
                      { 0, 1 } };

int_32 K, M[ 2 ][ 2 ];

void mult( int_32 A[ 2 ][ 2 ], int_32 B[ 2 ][ 2 ] ) {

//    int_32 i, j, k;

    M[ 0 ][ 0 ] = ( (int_64)A[ 0 ][ 0 ] * B[ 0 ][ 0 ] + (int_64)A[ 0 ][ 1 ] * B[ 1 ][ 0 ] ) % MOD;
    M[ 0 ][ 1 ] = ( (int_64)A[ 0 ][ 0 ] * B[ 0 ][ 1 ] + (int_64)A[ 0 ][ 1 ] * B[ 1 ][ 1 ] ) % MOD;
    M[ 1 ][ 0 ] = ( (int_64)A[ 1 ][ 0 ] * B[ 0 ][ 0 ] + (int_64)A[ 1 ][ 1 ] * B[ 1 ][ 0 ] ) % MOD;
    M[ 1 ][ 1 ] = ( (int_64)A[ 1 ][ 0 ] * B[ 0 ][ 1 ] + (int_64)A[ 1 ][ 1 ] * B[ 1 ][ 1 ] ) % MOD;

//    memset( M, 0, sizeof( M ) );

//    for( i = 0; i < 2; ++i )
//        for( j = 0; j < 2; ++j )
//            for( k = 0; k < 2; ++k )
//                M[ i ][ j ] = ( M[ i ][ j ] + A[ i ][ k ] * B[ k ][ j ] ) % MOD;

    memcpy( A, M, sizeof( M ) );
}

void get_pow( int_32 AUX[ 2 ][ 2 ], int_32 exp ) {

    int_32 i;

    for( i = 1; i <= exp; i <<= 1 ) {

        if( i & exp )
            mult( SOL, AUX );
        mult( AUX, AUX );
    }
}

int main() {

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

    scanf( "%d", &K );

    get_pow( AUX, K-1 );

//    printf( "%d %d\n", SOL[ 0 ][ 0 ], SOL[ 0 ][ 1 ] );
//    printf( "%d %d\n", SOL[ 1 ][ 0 ], SOL[ 1 ][ 1 ] );

    printf( "%d", ( SOL[ 0 ][ 0 ] + SOL[ 1 ][ 0 ] ) % MOD );

    return 0;
}