Cod sursa(job #3219458)

Utilizator AlexZeuVasile Alexandru AlexZeu Data 31 martie 2024 14:15:06
Problema Iepuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.88 kb
#include <fstream>
#include <stdlib.h>

const long long MOD = 666013;

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

void pow_matrix(long long** matrix, long long ***rez, long long n) {
    if (n == 0) {
        return;
    }

    long long** temp = (long long **)malloc(3 * sizeof(long long*));
    for (long long i = 0; i < 3; ++i) {
        temp[i] = (long long *)malloc(3 * sizeof(long long));
    }

    if (n % 2 == 0) {
        pow_matrix(matrix, rez, n / 2);
        for (long long i = 0; i < 3; ++i) {
            for (long long j = 0; j < 3; ++j) {
                temp[i][j] = 0;
                for (long long k = 0; k < 3; ++k) {
                    temp[i][j] += ((*rez)[i][k] * (*rez)[k][j]) % MOD;
                    temp[i][j] %= MOD;
                }
            }
        }
    } else {
        pow_matrix(matrix, rez, n - 1);
        for (long long i = 0; i < 3; ++i) {
            for (long long j = 0; j < 3; ++j) {
                temp[i][j] = 0;
                for (long long k = 0; k < 3; ++k) {
                    temp[i][j] += ((*rez)[i][k] * matrix[k][j]) % MOD;
                    temp[i][j] %= MOD;
                }
            }
        }
    }

    for (long long i = 0; i < 3; ++i) {
        for (long long j = 0; j < 3; ++j) {
            (*rez)[i][j] = temp[i][j] % MOD;
        }
    }

    for (long long i = 0; i < 3; ++i) {
        free(temp[i]);
    }
    free(temp);
}

int main() {
    long long T;
    fin >> T;

    long long** matrix = (long long **)malloc(3 * sizeof(long long*));
    for (long long i = 0; i < 3; ++i) {
        matrix[i] = (long long *)malloc(3 * sizeof(long long));
    }

    long long **powered_matrix = (long long **)malloc(3 * sizeof(long long*));
    for (long long i = 0; i < 3; ++i) {
        powered_matrix[i] = (long long *)malloc(3 * sizeof(long long));
    }
    
    while (T--) {
        long long x, y, z;
        fin >> x >> y >> z;
    
        long long a, b, c, n;
        fin >> a >> b >> c >> n;
    
        matrix[0][0] = a;
        matrix[0][1] = b;
        matrix[0][2] = c;
        matrix[1][0] = 1;
        matrix[1][1] = 0;
        matrix[1][2] = 0;
        matrix[2][0] = 0;
        matrix[2][1] = 1;
        matrix[2][2] = 0;

        powered_matrix[0][0] = 1;
        powered_matrix[0][1] = 0;
        powered_matrix[0][2] = 0;
        powered_matrix[1][0] = 0;
        powered_matrix[1][1] = 1;
        powered_matrix[1][2] = 0;
        powered_matrix[2][0] = 0;
        powered_matrix[2][1] = 0;
        powered_matrix[2][2] = 1;

        pow_matrix(matrix, &powered_matrix, n - 2);
        fout << ((powered_matrix[0][0] * z) % MOD
                + (powered_matrix[0][1] * y) % MOD
                + (powered_matrix[0][2] * x) % MOD) % MOD << '\n';
    }

    for (long long i = 0; i < 3; ++i) {
        free(matrix[i]);
        free(powered_matrix[i]);
    }
    free(matrix);
    free(powered_matrix);
    return 0;
}