Cod sursa(job #1303294)

Utilizator gedicaAlpaca Gedit gedica Data 27 decembrie 2014 20:28:11
Problema Iepuri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.78 kb
#include <algorithm>
#include <fstream>

using namespace std;

const int MOD= 666013, NMAX= 2;

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

int m1[NMAX+1][NMAX+1], m2[NMAX+1][NMAX+1];

void solve( int f[3][3], int g[3][3] )
{
    int ans[3][3]= {{0, 0, 0}, {0, 0, 0}, {0, 0, 0}};
    for ( int i= 0; i<=2; ++i )
    {
        for ( int j= 0; j<=2; ++j )
        {
            for ( int k= 0; k<=2; ++k )
            {
                ans[i][j]= ( ans[i][j]*1LL + f[i][k]*g[k][j]*1LL )%MOD;
            }
        }
    }

    for ( int i= 0; i<=2; ++i )
    {
        for ( int j= 0; j<=2; ++j )
        {
            f[i][j]= ans[i][j];
        }
    }
}

void power_up( int P )
{
    for ( int ok= 0; P>0; P/= 2 )
    {
        if ( P%2==1 )
        {
            if ( ok==1 ) solve( m2, m1 );
            else
            {
                for ( int i= 0; i<=2; ++i )
                {
                    for ( int j= 0; j<=2; ++j )
                    {
                        m2[i][j]= m1[i][j];
                    }
                }
            }
            ok= 1;
        }
        solve( m1 , m1 );
    }
}

int T, x, y, z, a, b, c, n;

int main(  )
{
    in >> T;

    for ( int t= 1; t<=T; ++t )
    {
        in >> x >> y >>z;
        in >> a >> b >> c >> n;

        for ( int i= 0; i<=2; ++i )
        {
            for ( int j= 0; j<=2; ++j )
            {
                m2[i][j]= 1;
                m1[i][j]= 0;
            }
        }

        m1[0][0]= a;
        m1[1][0]= b;
        m1[2][0]= c;
        m1[0][1]= 1;
        m1[1][2]= 1;

        power_up( n-2 );

        int afis= ( 1LL*x*m2[2][0] + 1LL*y*m2[1][0] + 1LL*z*m2[0][0] )%MOD;

        out << afis << '\n';
    }

    return 0;
}