Cod sursa(job #2184375)

Utilizator gaape97Gabriel-Alexandru Pesu gaape97 Data 23 martie 2018 23:36:31
Problema Iepuri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.73 kb
#include <iostream>
#include <cstring>
#include <fstream>

using namespace std;

#define MOD  666013
#define KMAX 3

// C = A * B
void multiply_matrix(long A[KMAX][KMAX], long B[KMAX][KMAX], long C[KMAX][KMAX]) {
    long tmp[KMAX][KMAX];

    for (int i = 0; i < KMAX; ++i) {
        for (int j = 0; j < KMAX; ++j) {
            unsigned long long sum = 0;

            for (int k = 0; k < KMAX; ++k) {
                sum += 1LL * A[i][k] * B[k][j];
            }

            tmp[i][j] = sum % MOD;
        }
    }

    memcpy(C, tmp, sizeof(tmp));
}

// R = C^p
void power_matrix(long C[KMAX][KMAX], int p, long R[KMAX][KMAX]) {
    long tmp[KMAX][KMAX];
    for (int i = 0; i < KMAX; ++i) {
        for (int j = 0; j < KMAX; ++j) {
            tmp[i][j] = (i == j) ? 1 : 0;
        }
    }

    while (p != 1) {
        if  (p % 2 == 0) {
            multiply_matrix(C, C, C);
            p /= 2;
        } else {
            multiply_matrix(tmp, C, tmp);
            --p;
        }
    }

    multiply_matrix(C, tmp, R);
}

long iepuri(int N, int X, int Y, int Z, int A, int B, int C) {
    if (N == 0) return X;
    if (N == 1) return Y;
    if (N == 2) return Z;

    int M[KMAX][KMAX] = { {0, 0, C},
                          {1, 0, B},
                          {0, 1, A} };

   power_matrix(M, N - 2, M);

   long sol = X * M[0][2] + Y * M[1][2] + Z * M[2][2];
   return sol % MOD;
}

int main() {
	int T, X, Y, Z, A, B, C;
	long N;

	ifstream f("iepuri.in");
	ofstream g("iepuri.out");

	f >> T;
	for (int i = 0; i < T; ++i) {
		f >> X >> Y >> Z >> A >> B >> C >> N;
		long sol = iepuri(N, X, Y, Z, A, B, C);
		g << sol << '\n';
	}

	f.close();
	g.close();

    return 0;
}