Cod sursa(job #1304312)

Utilizator gedicaAlpaca Gedit gedica Data 28 decembrie 2014 20:38:00
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.77 kb
#include <algorithm>
#include <fstream>

using namespace std;

typedef long long i64;
const int MOD= 666013;

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

int m1[3][3], m2[3][3];

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]= ( (i64)ans[i][j] + (i64)f[i][k]*g[k][j] )%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 >> 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= ( (i64)x*m2[2][0]+(i64)y*m2[1][0]+(i64)z*m2[0][0] )%MOD;

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

    return 0;
}