Cod sursa(job #2111658)

Utilizator papinub2Papa Valentin papinub2 Data 22 ianuarie 2018 15:51:06
Problema Iepuri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.37 kb
#include <fstream>
#define MOD 666013

using namespace std;

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

const int Nmax = 3;

int t, x, y, z, a, b, c, n;
int Mat[Nmax][Nmax], Sol[Nmax][Nmax];

void multiply (int A[Nmax][Nmax], int B[Nmax][Nmax])
{
    int C[Nmax][Nmax];

    for(int i = 0; i < 3; i++)
        for(int j = 0; j < 3; j++)
    {
        C[i][j] = 0;
        for(int k = 0; k < 3; k++)
        C[i][j] = (C[i][j] + A[i][k] * B[k][j]) % MOD;
    }

    for(int i = 0; i < 3; i++)
        for(int j = 0; j < 3; j++)
            A[i][j] = C[i][j];
}

void curatare (int A[Nmax][Nmax], int B[Nmax][Nmax])
{
    for(int i = 0; i < 3; i++)
        for(int j = 0; j < 3; j++)
            A[i][j] = B[i][j] = 0;
}

void init (int A[Nmax][Nmax], int B[Nmax][Nmax])
{
    A[0][0] = a;
    A[0][1] = b;
    A[0][2] = c;

    B[0][2] = z;
    B[1][2] = y;
    B[2][2] = x;
    B[1][0] = 1;
    B[2][1] = 1;
}

int main()
{
    in >> t;

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

        init (Sol, Mat);

        for (int j = 0; (1<<j) <= n; j++)
        {
            if ((1<<j) & n)
                multiply (Sol, Mat);
            multiply (Mat, Mat);
        }

        out << Sol[0][2] << '\n';
        curatare (Sol, Mat);
    }

    return 0;
}