Cod sursa(job #3327519)

Utilizator lucaclgluca clg lucaclg Data 4 decembrie 2025 12:15:01
Problema Iepuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.86 kb
#include <iostream>
#include <fstream>
#define MOD 666013
using namespace std;
ifstream fin("iepuri.in");
ofstream fout("iepuri.out");
long long task, a, b, c, x, y, z, n, rez[3][3];

void inmultire(long long a[3][3], long long b[3][3], long long rez[3][3])
{
	long long temp[3][3];
	for (int i = 0; i < 3; i++)
		for (int j = 0; j < 3; j++)
		{
			temp[i][j] = 0;
			for (int k = 0; k < 3; k++)
				temp[i][j] = (temp[i][j] + (a[i][k] * b[k][j]) % MOD) % MOD;
		}
	for (int i = 0; i < 3; i++)
		for (int j = 0; j < 3; j++)
			rez[i][j] = temp[i][j];
}

void putere(long long trans[3][3], long long p, long long rez[3][3])
{
	for (int i = 0; i < 3; i++)
		for (int j = 0; j < 3; j++)
			rez[i][j] = (i == j);

	long long base[3][3];
	for (int i = 0; i < 3; i++)
		for (int j = 0; j < 3; j++)
			base[i][j] = trans[i][j];

	while (p)
	{
		if (p % 2 == 1)
			inmultire(rez, base, rez);
		inmultire(base, base, base);
		p /= 2;
	}
}

int main()
{
	fin >> task;
	while (task--)
	{
		fin >> x >> y >> z >> a >> b >> c >> n;
		if (n == 0)
			fout << x % MOD << '\n';
		else if (n == 1)
			fout << y % MOD << '\n';
		else if (n == 2)
			fout << z % MOD << '\n';
		else
		{
			long long trans[3][3];
			trans[0][0] = 0;
			trans[0][1] = 0;
			trans[0][2] = c % MOD;
			trans[1][0] = 1;
			trans[1][1] = 0;
			trans[1][2] = b % MOD;
			trans[2][0] = 0;
			trans[2][1] = 1;
			trans[2][2] = a % MOD;
			putere(trans, n - 2, rez);
			long long answer = 0;
			answer = (answer + (rez[0][2] * (x % MOD)) % MOD) % MOD;
			answer = (answer + (rez[1][2] * (y % MOD)) % MOD) % MOD;
			answer = (answer + (rez[2][2] * (z % MOD)) % MOD) % MOD;
			fout << answer << '\n';
		}
	}
	return 0;
}
/*
* x = z0
* y = z1
* z = z2
* z(n) = a*z(n - 1) + b*z(n - 2) + c*z(n - 3)
* z(n) = (x, y, z) * T^(n - 2)
* T = (0 1 0)
*     (0 0 1)
*     (c b a)
*/