Cod sursa(job #2593713)

Utilizator popoviciAna16Popovici Ana popoviciAna16 Data 4 aprilie 2020 14:30:41
Problema Iepuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.43 kb
#include <fstream>
using namespace std;

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

typedef int mat[3][3];
const int r = 666013;

void inmul(mat a, mat b, mat c)
{
    int i, j, k;
    for (i = 0; i<3; i++)
        for (j = 0; j<3; j++)
            c[i][j] = 0;
    for (i = 0; i<3; i++)
        for (j = 0; j<3; j++)
            for (k = 0; k<3; k++)
                c[i][j] = (c[i][j] + 1ll*a[i][k]*b[k][j])%r;
}

void copie(mat a, mat b)
{
    //a <- b
    int i, j;
    for (i = 0; i<3; i++)
        for (j = 0; j<3; j++)
            a[i][j] = b[i][j];
}

void exp(mat a, int e, mat rez)
{
    mat aux;
    rez[0][0] = rez[1][1] = rez[2][2] = 1;
    while (e > 0)
    {
        if (e&1)
        {
            copie(aux, rez);
            inmul(aux, a, rez);
        }
        copie(aux, a);
        inmul(aux, aux, a);
        e >>= 1;
    }
}

int main()
{
    int t, x, y, z, a, b, c, i, n;
    fin >> t;
    for (i = 1; i<=t; ++i)
    {
        fin >> x >> y >> z >> a >> b >> c >> n;
        mat init = {
            {0, 0, c},
            {1, 0, b},
            {0, 1, a}
                    };
        mat f = {};
        if (n == 0)
            fout << x << '\n';
        else if (n == 1)
            fout << y << '\n';
        else if (n == 2)
            fout << z << '\n';
        else
        {
            exp(init, n-2, f);
            fout << (1ll*x*f[0][2] + 1ll*y*f[1][2] + 1ll*z*f[2][2])%r << '\n';
        }
    }
    return 0;
}