Cod sursa(job #1840650)

Utilizator alexandruchiriacAlexandru Chiriac alexandruchiriac Data 4 ianuarie 2017 18:11:09
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.92 kb
#include <iostream>
#include <fstream>
#include <cstring>

#define mod 666013
using namespace std;

ifstream f("iepuri.in");
ofstream g("iepuri.out");

long long T , X , Y , Z , A , B , C , N ;
long long MATRIX[4][4];
long long O3[4][4];
long long aux[4][4];

void refill ()
{
    memset ( MATRIX , 0 , sizeof MATRIX );
    MATRIX[1][3] = C;
    MATRIX[2][3] = B;
    MATRIX[3][3] = A;
    MATRIX[2][1] = 1;
    MATRIX[3][2] = 1;

    memset(O3,0,sizeof O3);
    O3[1][1] = O3[2][2] = O3[3][3] = 1;

    memset(aux,0,sizeof aux);
}

void inmultire ( long long  A[4][4] , long long B[4][4] )
{
    long long C[4][4];
    memset(C,0,sizeof C);
    for ( int i = 1; i <= 3; i++ )
    {
        for ( int j = 1; j <= 3 ; j++ )
        {
            for ( int k = 1; k <= 3 ; k++ )
                C[i][j] += A[i][k] * B[k][j] ;
        }
    }
    for ( int i = 1; i <= 3; i++ )
        for ( int j = 1; j <= 3; j++ )
            A[i][j] = C[i][j]%mod;
}

void exp_log ( long long A[4][4] , long long N )
{
    while ( N )
    {
        if ( N % 2 == 1 )
        {
            N--;
            inmultire(O3,A);
        }
        N = N / 2;
        inmultire(A,A);
    }
}
void multiply ( long long A[4][4] , long long B[4][4] )
{
    int C[4][4];
    C[1][1] = (A[1][1]*B[1][1] + A[1][2]*B[2][1] + A[1][3]*B[3][1])%mod;
    C[1][2] = (A[1][1]*B[1][2] + A[1][2]*B[2][2] + A[1][3]*B[2][3])%mod;
    C[1][3] = (A[1][1]*B[1][3] + A[1][2]*B[2][3] + A[1][3]*B[3][3])%mod;

    for ( int i = 1; i <= 3; i++ )
        for ( int j = 1; j <= 3; j++ )
            A[i][j] = C[i][j]%mod;
}
int main()
{
    f >> T ;
    for ( ; T-- ; )
    {
        f >> X >> Y >> Z >> A >> B >> C >> N ;

        refill();

        aux[1][1] = X;
        aux[1][2] = Y;
        aux[1][3] = Z;


        exp_log(MATRIX,N);

        inmultire(aux,O3);

        g << aux[1][1] << "\n" ;
    }
    return 0;
}