Cod sursa(job #3289857)

Utilizator alexcazacudanCazacu Alexandru Dan alexcazacudan Data 28 martie 2025 20:27:01
Problema Iepuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.27 kb
#include <iostream>
#include <fstream>
using namespace std;

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

long mod = 666013;

void mult(int a[3][3], int b[3][3]) {
	int c[3][3];
	for (int i = 0; i < 3; i++) {
		for (int j = 0; j < 3; j++) {
			c[i][j] = 0;
			for (int k = 0; k < 3; k++) {
				c[i][j] += (1LL * a[i][k] * b[k][j]) % mod;
			}
		}
	}

	for (int i = 0; i < 3; i++) {
		for (int j = 0; j < 3; j++) {
			a[i][j] = c[i][j];
		}
	}
}

void exp(int base[3][3], int N, int ans[3][3]) {
	while (N) {
		if (N % 2 == 0) {
			mult(base, base);
			N /= 2;
		} else {
			mult(ans, base);
			N--;
		}
	}
}

int solve(int mat[3][3], int x, int y, int z, int N) {
	int res[3][3];

	for (int i = 0; i < 3; i++) {
		for (int j = 0; j < 3; j++) {
			res[i][j] = (i == j);
		}
	}

	exp(mat, N - 2, res);
	return (((1LL * x * res[0][2]) % mod + (1LL * y * res[1][2]) % mod) % mod + (1LL * z * res[2][2]) % mod) % mod;
}

int main() {
	int n;
	f >> n;

	int mat[3][3];
	for (int i = 0; i < n; i++) {
		int x, y, z, a, b, c, N;
		f >> x >> y >> z >> a >> b >> c >> N;
		mat[0][0] = 0;
		mat[0][1] = 0;
		mat[1][0] = 1;
		mat[1][1] = 0;
		mat[2][0] = 0;
		mat[2][1] = 1;
		mat[0][2] = c;
		mat[1][2] = b;
		mat[2][2] = a;

		g << solve(mat, x, y, z, N) << "\n";
	}

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

	return 0;
}