Cod sursa(job #854347)

Utilizator bogdan93Grigorescu Bogdan bogdan93 Data 13 ianuarie 2013 13:31:53
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.9 kb
#include <cstdio>
#include <cstdlib>

#define mod 666013

int X , Y , Z , A , B , C , N , n ;
long long M [ 3 ][ 3 ] , rez [ 3 ][ 3 ] , asd [ 3 ][ 3 ] ;


void copy ( long long A [  ][ 3 ] , long long B [  ][ 3 ] )
{
    for ( int i = 0 ; i <= 2 ; i++ )
        for ( int  j = 0 ; j <= 2 ; 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 <= 2 ; i++ )
        for ( int j = 0 ; j <= 2 ; j++ )
            A [ i ][ j ] = 0 ;

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

void aaa ()
{
    long long aux [ 3 ][ 3 ] ;
    M [ 0 ][ 0 ] = M [ 0 ][ 2 ] = M [ 1 ][ 0 ] = M [ 1 ][ 1 ] = 0 ;
    M [ 0 ][ 1 ] = M [ 1 ][ 2 ] = 1 ;
    M [ 2 ][ 0 ] = C ;
    M [ 2 ][ 1 ] = B ;
    M [ 2 ][ 2 ] = A ;

    for ( int i = 0 ; i <= 2 ; i++ )
        for ( int j = 0 ; j <= 2 ; j++ )
            rez [ i ][ j ] = 0 ;
    rez [ 1 ][ 1 ] = rez [ 2 ][ 2 ] = rez [ 0 ][ 0 ] = 1 ;

    int p = N ;
    while ( p )
    {
        if ( p & 1 )
            {
                mult ( aux , rez , M ) ;
                copy ( rez , aux ) ;
            }
        p >>= 1;
        mult ( aux , M , M ) ;
        copy ( M , aux ) ;
    }
}

int main ()
{
    FILE *fin , *fout ;
    fin = fopen ( "iepuri.in" , "rt" ) ;
    fout = fopen ( "iepuri.out" , "wt" ) ;

    fscanf ( fin , "%d" , &n ) ;

    for ( int i = 1 ; i <= n ; i++ )
    {
        fscanf ( fin , "%d %d %d %d %d %d %d " , &X , &Y , &Z , &A , &B , &C , &N ) ;
        aaa () ;
        fprintf ( fout , "%lld\n" ,  ( X * rez [ 0 ][ 0 ] + Y * rez [ 0 ][ 1 ] + Z * rez [ 0 ][ 2 ] ) % mod ) ;
    }
    fclose ( fin ) ;
    fclose ( fout ) ;

    return 0 ;
}