Cod sursa(job #2374613)

Utilizator i.uniodCaramida Iustina-Andreea i.uniod Data 7 martie 2019 19:37:44
Problema Iepuri Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.42 kb
#include <fstream>
#include <cstring>
using namespace std;
ifstream fin("iepuri.in");
ofstream fout("iepuri.out");

int a, b, c, x, y, z, n;
long long mat[4][4], slv[4][4];
const int mod = 666013;

void Initialization()
{
    memset(mat, 0, sizeof(mat));
    memset(slv, 0, sizeof(slv));

    mat[2][1] = mat[3][2] = 1;
    mat[1][3] = c;
    mat[2][3] = b;
    mat[3][3] = a;

    slv[1][1] = slv[2][2] = slv[3][3] = 1;
}

void Multiplication(long long a[4][4], long long b[4][4])
{
    long long copy_mat[4][4];
    memset(copy_mat, 0, sizeof(copy_mat));

    for(int i = 1; i <= 3; ++ i)
        for(int j = 1; j <= 3; ++ j)
            for(int k = 1; k <= 3; ++ k)
                copy_mat[i][j] = (copy_mat[i][j] + a[i][k] * b[k][j]) % mod;

    for(int i = 1; i <= 3; ++ i)
        for(int j = 1; j <= 3; ++ j)
            a[i][j] = copy_mat[i][j];
}

void Slove() // Se ridica matricea mat la puterea n-2( zilele 0, 1, 2 sunt deja facute)
{
    n -= 2;
    for(int i = 1; i <= n; i <<= 1)
    {
        if(i & n)
            Multiplication(slv, mat);
        Multiplication(mat, mat);
    }

    fout <<(x * slv[1][3] + y * slv[2][3] + z * slv[3][3]) % mod;
}

int main()
{
    int task;
    fin >> task;
    for(int i = 1; i <= task; ++ i)
    {
        fin >> x >> y >> z >> a >> b >> c >> n;
        Initialization();
        Slove();
        fout << '\n';
    }
    return 0;
}