Cod sursa(job #2583339)

Utilizator EmilianManescuManescu Emilian-Claudiu EmilianManescu Data 18 martie 2020 02:25:02
Problema Iepuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.83 kb
#include <bits/stdc++.h>
using namespace std;

#define MOD 666013
#define KMAX 3


void multiply_matrix(int A[KMAX][KMAX], int B[KMAX][KMAX], int C[KMAX][KMAX]) {
    int 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;
        }
    }
 
    //  C = tmp
    memcpy(C, tmp, sizeof(tmp));
}

void power_matrix(int C[KMAX][KMAX], int p, int R[KMAX][KMAX]) {
    // tmp = I (matricea identitate)
    int 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);     // C = C*C
            p /= 2;                       // ramane de calculat C^(p/2)
        } else {
            // reduc la cazul anterior:
            multiply_matrix(tmp, C, tmp); // tmp = tmp*C
            --p;                          // ramane de calculat C^(p-1)
        }
    }
 
    // avem o parte din rezultat in C si o parte in tmp
    multiply_matrix(C, tmp, R);           // rezultat = tmp * C
}

int main() {
	ifstream fin("iepuri.in");
	ofstream fout("iepuri.out");
	int t;
	fin >> t; // numarul de seturi de date

	int x, y, z, a, b, c, n;
	int result;

	for (int i = 0; i < t; i++) {
		fin >> x >> y >> z >> a >> b >> c >> n;

		result = 0;

		int C[KMAX][KMAX] = { {0, 0, c},
	                          {1, 0, b},
	                          {0, 1, a}};

		power_matrix(C, n - 2, C);


		result = ((1LL * x * C[0][2]) % MOD + (1LL * y * C[1][2]) + (1LL * z * C[2][2])) % MOD;
		result = result % MOD;
		fout << result << endl;
	}

	fin.close();
	fout.close();

	return 0;
}