Cod sursa(job #854345)

Utilizator bogdan93Grigorescu Bogdan bogdan93 Data 13 ianuarie 2013 13:28:45
Problema Iepuri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.92 kb
#include <cstdio>
#include <cstdlib>

#define mod 666013

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


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

void mult ( int A [  ][ 4 ] , int B [  ][ 4 ] , int C [  ][ 4 ] )
{
    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 ()
{
    int aux [ 4 ][ 4 ] ;
    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 ) ;
        printf ( "%d %d %d %d %d %d %d\n" , X , Y , Z , A , B , C , N ) ;
        aaa () ;
        fprintf ( fout , "%d\n" , X * rez [ 0 ][ 0 ] + Y * rez [ 0 ][ 1 ] + Z * rez [ 0 ][ 2 ] ) ;
    }
    fclose ( fin ) ;
    fclose ( fout ) ;

    return 0 ;
}