Cod sursa(job #2237571)

Utilizator AraldaAralda Pacurar Aralda Data 2 septembrie 2018 12:30:45
Problema Iepuri Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.45 kb
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

#define MODULO 666013

int sol[3][3];
int x, y, z;
int a, b, c;

void multiply(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] = (c[i][j] + (1LL * a[i][k] * b[k][j]) % MODULO) % MODULO;
			}
		}
	}
	
	for (int i = 0; i < 3; i++) {

		for (int j = 0; j < 3; j++) {

			a[i][j] = c[i][j];
		}
	}
}

void n_day(int n) {

	int mat[3][3] = { {a, b, c}, {1, 0, 0}, {0, 1, 0} };

	for (int i = 0; i < 3; i++) {

		for (int j = 0; j < 3; j++) {

			if (i == j) {

				sol[i][j] = 1;
			}
			else {

				sol[i][j] = 0;
			}
		}
	}

	while (n > 0) {

		if (n % 2 == 1) {

			multiply(sol, mat);
		}

		multiply(mat, mat);
		n /= 2;
	}
}

int main() {

	FILE* ip;
	ip = fopen("iepuri.in", "r");
	if (ip == NULL) {

		perror("Cannot open input file");
		return 1;
	}

	FILE* op;
	op = fopen("iepuri.out", "w");
	if (op == NULL) {

		perror("Cannot open output file");
		return 1;
	}

	int t;
	int n;

	fscanf(ip, "%d", &t);

	for (int i = 0; i < t; i++) {

		fscanf(ip, "%d%d%d", &x, &y, &z);
		fscanf(ip, "%d%d%d", &a, &b, &c);
		fscanf(ip, "%d", &n);

		n_day(n - 2);

		int res = ((sol[0][0] * z) % MODULO + (sol[0][1] * y) % MODULO + (sol[0][2] * x) % MODULO) % MODULO;

		fprintf(op, "%d\n", res);
	}

	return 0;
}