Cod sursa(job #2329776)

Utilizator MateiAruxandeiMateiStefan MateiAruxandei Data 27 ianuarie 2019 14:05:45
Problema Iepuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.57 kb
#include <fstream>

#define MOD 666013

using namespace std;

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

long long M[4][4];
long long X, Y, Z, A, B, C, N;

void intializare(){
    M[1][1] = 0;
    M[2][1] = 1;
    M[3][1] = 0;
    M[1][2] = 0;
    M[2][2] = 0;
    M[3][2] = 1;
    M[1][3] = C;
    M[2][3] = B;
    M[3][3] = A;
}

void inmultesteMatrice(long long  rez[4][4], long long  a[4][4], long long  b[4][4]){
    for(int i = 1; i <= 3; ++i)
        for(int j = 1; j <= 3; ++j)
            rez[i][j] = 0;
    for(int i = 1; i <= 3; ++i)
        for(int j = 1; j <= 3; ++j)
            for(int k = 1; k <= 3; ++k)
                rez[i][j] += (a[i][k] * b[k][j]) % MOD;
}

void ridicLaPut(int p){
    if(p == 1){
        intializare();
        return;
    }

    long long  copie[4][4];
    for(int i = 1; i <= 3; ++i)
        for(int j = 1; j <= 3; ++j)
            copie[i][j] = M[i][j];

    ridicLaPut(p / 2);

    long long aux[4][4];
    inmultesteMatrice(aux, M, M);

    if(p % 2 == 0){
        for(int i = 1; i <= 3; ++i)
            for(int j = 1; j <= 3; ++j)
                M[i][j] = aux[i][j];
        return;
    }

    long long aux2[4][4];
    inmultesteMatrice(aux2, aux, copie);

    for(int i = 1; i <= 3; ++i)
        for(int j = 1; j <= 3; ++j)
            M[i][j] = aux2[i][j];
    return;
}

int main()
{
    int t;
    cin >> t;
    while(t--){
        cin >> X >> Y >> Z >> A >> B >> C >> N;

        intializare();

        ridicLaPut((N - 2));

        cout << (X * M[1][3] % MOD+ Y * M[2][3] % MOD + Z * M[3][3] % MOD) % MOD << '\n';
    }
    return 0;
}