Cod sursa(job #854283)

Utilizator bogdan93Grigorescu Bogdan bogdan93 Data 13 ianuarie 2013 11:23:46
Problema Al k-lea termen Fibonacci Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.7 kb
#include <cstdio>
#include <cstdlib>

#define mod  666013

long long K , p ;
long long Z [ 3 ][ 3 ] , rez [ 3 ][ 3 ] , aux [ 3 ][ 3 ] ;
void citire ()
{
    FILE *fin ;
    fin = fopen ( "kfib.in" , "rt" ) ;

    fscanf ( fin , "%lld" , &K ) ;
    fclose ( fin ) ;

}

void copy ( long long A [  ][ 3 ] , long long B [  ][ 3 ] )
{
    for ( int i = 0 ; i <= 1 ; i++ )
        for ( int j = 0 ; j <= 1 ; j++ )
            A [ i ][ j ] = B [ i ][ j ] ;
}

void mult ( long long A[  ][ 3 ] , long long B [  ][ 3 ] , long long C [  ][ 3 ] )
{
    for ( int i = 0 ; i <= 1 ; i++ )
        for ( int j = 0 ; j <= 1 ; j++ )
            A [ i ][ j ] = 0 ;

    for ( int i = 0 ; i <= 1 ; i++  )
        for ( int j = 0 ; j <= 1 ; j++ )
            for ( int k = 0 ; k <= 1 ; k++ )
                    A [ i ][ j ] = ( A[ i ][ j ] + ( B [ i ][ k ] * C [ k ][ j ] ) % mod ) % mod ;

}
void add ( long long A [  ][ 3 ] , long long B [  ][ 3 ] )
{
    for ( int i = 0 ; i <= 1 ; i++ )
        for ( int j = 0 ; j <= 1 ; j++ )
            A [ i ][ j ] =A [ i ][ j ] + B [ i ][ j ] ;
}
void afisare ()
{
  FILE *fout ;
  fout = fopen ( "kfib.out" , "wt" ) ;
  fprintf ( fout , "%lld\n" , rez[0][0] ) ;
  fclose ( fout ) ;
}

int main ()
{
    citire () ;

    Z [ 0 ][ 0 ] = 0 ;
    Z [ 0 ][ 1 ] = Z [ 1 ][ 0 ] = Z [ 1 ][ 1 ] = 1 ;
    p = K - 1 ;
    rez [ 0 ][ 0 ] = rez [ 0 ][ 1 ] = rez [ 1 ][ 0 ] = rez [ 1 ][ 1 ] = 1;
    while ( p )
    {

        if ( p & 1 )
            {
                mult ( aux , rez , Z ) ;
                copy ( rez , aux ) ;

            }
        copy ( aux , Z ) ;

        mult ( Z , aux , aux ) ;
        p >>= 1 ;

    }
    afisare () ;

}