Cod sursa(job #782662)

Utilizator repp4raduRadu-Andrei Szasz repp4radu Data 28 august 2012 16:00:59
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.51 kb
#include <fstream>
#include <cstring>

#define REST 666013

using namespace std;

long long dp[3][3], sol[1][3], m[3][3], aux[3][3];
int t, x, y, z, a, b, c, n;

void mul(long long a[][3], long long b[][3], long long c[][3])
{
    for(int i = 0; i < 3; i++)
        for(int j = 0; j < 3; j++)
            for(int k = 0; k < 3; k++)
                c[i][j] = (c[i][j] + 1LL * a[i][k] * b[k][j]) % REST;
}

void mul2()
{
    for(int i = 0; i < 1; i++)
        for(int j = 0; j < 3; j++)
            for(int k = 0; k < 3; k++)
                sol[i][j] = (sol[i][j] + aux[i][k] * m[k][j]) % REST;
}

void lgput(int pw)
{
    while(pw)
    {
        if(pw & 1)
        {
            memset(aux, 0, sizeof(aux));
            mul(m, dp, aux);
            memcpy(m, aux, sizeof(aux));
            pw--;
        }
        memset(aux, 0, sizeof(aux));
        mul(dp, dp, aux);
        memcpy(dp, aux, sizeof(aux));
        pw >>= 1;
    }
}

int main()
{
    ifstream in("iepuri.in"); ofstream out("iepuri.out");
    in>>t;
    for(int i = 1; i <= t; i++)
    {
        in>>x>>y>>z>>a>>b>>c>>n;
        memset(m, 0, sizeof(m));

        memset(sol, 0, sizeof(sol));
        memset(dp, 0, sizeof(dp));
        m[1][0] = m[2][1] = dp[1][0] = dp[2][1] = 1;
        m[0][2] = dp[0][2] = c;
        m[1][2] = dp[1][2] = b;
        m[2][2] = dp[2][2] = a;
        lgput(n - 1);
        aux[0][0] = x; aux[0][1] = y; aux[0][2] = z;
        mul2();
        out<<sol[0][0]<<"\n";
    }
    return 0;
}