Cod sursa(job #1404958)

Utilizator Ionut228Ionut Calofir Ionut228 Data 28 martie 2015 18:23:07
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <fstream>

using namespace std;

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

const int MOD = 666013;

int T, N, X, Y, Z, A, B, C;

struct matrice
{
    long long mat[5][5];
};
matrice M, sol;

matrice mult(matrice a, matrice b)
{
    matrice aux;

    for (int i = 1; i <= 3; ++i)
        for (int j = 1; j <= 3; ++j)
        {
            aux.mat[i][j] = 0;
            for (int k = 1; k <= 3; ++k)
                aux.mat[i][j] = (aux.mat[i][j] + (a.mat[i][k] * b.mat[k][j]) % MOD) % MOD;
        }

    return aux;
}

matrice ridPutere(matrice M, int P)
{
    matrice aux;

    if (P == 1)
        return M;

    aux = ridPutere(M, P / 2);
    aux = mult(aux, aux);

    if (P % 2 == 1)
        aux = mult(M, aux);

    return aux;
}

// o problema asemanatoare s-a dat la OJI 2015, clasele 11-12, dar pentru ca nu am facut-o, la OJI am luat doar 70 de puncte :'(
int main()
{
    fin >> T;

    while (T--)
    {
        fin >> X >> Y >> Z >> A >> B >> C >> N;

        M.mat[1][1] = 0;
        M.mat[1][2] = 1;
        M.mat[1][3] = 0;
        M.mat[2][1] = 0;
        M.mat[2][2] = 0;
        M.mat[2][3] = 1;
        M.mat[3][1] = C;
        M.mat[3][2] = B;
        M.mat[3][3] = A;

        sol = ridPutere(M, N);
        fout << ((sol.mat[1][1] * X) % MOD + (sol.mat[1][2] * Y) % MOD + (sol.mat[1][3] * Z) % MOD) % MOD << '\n';
    }

    fin.close();
    fout.close();
    return 0;
}