Cod sursa(job #2214286)

Utilizator test111111111111test111111111111 test111111111111 Data 18 iunie 2018 18:21:20
Problema Iepuri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.33 kb
#include <iostream>
#include <cstdio>
#include <cassert>

using namespace std;

#define MOD     666013
#define KMax    3

/**
 * inmultirea a doua matrici
 * @param a
 * @param b
 * @param c rezultatul in c
 */
void multiply_matrix(long long A[KMax][KMax], long long B[KMax][KMax],
                     long long C[KMax][KMax]) {
    long long tmp[KMax][KMax] = {{0}};

    for (int i = 0; i < KMax; i++) {
        for (int j = 0; j < KMax; j++) {
            for (int k = 0; k < KMax; k++) {
                tmp[i][j] += (A[i][k] * B[k][j] % MOD);
                tmp[i][j] %= MOD;
            }
        }
    }

    for (int i = 0; i < KMax; i++) {
        for (int j = 0; j < KMax; j++) {
            C[i][j] = tmp[i][j];
        }
    }
}

void power_matrix(long long A[KMax][KMax], int n, long long tmp[KMax][KMax]) {
    for (int i = 0; i < KMax; i++) {
        for (int j = 0; j < KMax; j++) {
            tmp[i][j] = A[i][j];
        }
    }

    int i = n;

    while (i > 1) {
        multiply_matrix(tmp, tmp, tmp);
        i /= 2;
    }

    if (n % 2 == 1 && n != 1) {
        multiply_matrix(tmp, A, tmp);
    }
}

int main() {
    FILE *input = fopen("iepuri.in", "r");
    FILE *output = fopen("iepuri.out", "w+");
    if (input == NULL || output == NULL) {
        fprintf(stderr, "Error open file!\n");
        exit(EXIT_FAILURE);
    }

    int number;
    assert(fscanf(input, "%d", &number) == 1);
    for (int i = 0; i < number; i++) {
        int X, Y, Z, A, B, C, N;
        int a = fscanf(input, "%d %d %d %d %d %d %d", &X, &Y, &Z, &A, &B, &C,
                       &N);
        assert(a == 7);
        /** cazurile de baza */
        if (N == 0) {
            fprintf(output, "%d\n", X);
            continue;
        }

        if (N == 1) {
            fprintf(output, "%d\n", Y);
            continue;
        }

        if (N == 2) {
            fprintf(output, "%d\n", Z);
            continue;
        }

        long long trib[KMax][KMax] = {
                {A, B, C},
                {1, 0, 0},
                {0, 1, 0}
        };

        long long rez[KMax][KMax];
        power_matrix(trib, N - 2, rez);

        long long Tn = (rez[0][0] * Z) % MOD + (rez[0][1] * Y) % MOD +
                       (rez[0][2] * X) % MOD;
        int fn = Tn % MOD;
        fprintf(output, "%d\n", fn);
    }

    fclose(input);
    fclose(output);

    return 0;
}