Cod sursa(job #2857598)

Utilizator Darius_CDarius Chitu Darius_C Data 25 februarie 2022 22:01:27
Problema Iepuri Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.98 kb
// Iepuri.cpp : This file contains the 'main' function. Program execution begins and ends there.
//

/*
f(n)  =   A*f(n-1)+B*f(n-2)+C*f(n-3),  n>3
		  Y,                           n=3
		  Z,                           n=2
		  X,                           n=1
k=3

(0 1 0)^(n-3)     (X)       (f(n-2))
(0 0 1)        x  (Y)   =   (f(n-1))
(C B A)           (Z)       ( f(n) )
*/

#include <iostream>
#include <fstream>
#define DIM 6
#define MOD 666013
std::ifstream fin("iepuri.in");
std::ofstream fout("iepuri.out");
using namespace std;

int X, Y, Z;
int A, B, C;
int N;
int Identity[DIM][DIM], vect[DIM][DIM];
int ans;

void MultiplyMatrix(int A[][DIM], int B[][DIM], int n, int m, int p)
{ // A = A * B
	int C[DIM][DIM];
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= p; j++)
			C[i][j] = 0;
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= p; j++)
			for (int k = 1; k <= m; k++)
				C[i][j] = (C[i][j] + A[i][k] * B[k][j]) % MOD;
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= p; j++)
			A[i][j] = C[i][j];
}

void identity_matrix(int p[][DIM])
{
	for (int i = 1; i <= 3; i++)
		for (int j = 1; j <= 3; j++)
			p[i][j] = 0;
	for (int i = 1; i <= 3; i++)
		p[i][i] = 1;
}

void plog(int e)
{
	int p[DIM][DIM];
	identity_matrix(p);
	for (; e; e >>= 1, MultiplyMatrix(Identity, Identity, 3, 3, 3))
		if (e & 1)
			MultiplyMatrix(p, Identity, 3, 3, 3);

	for (int i = 1; i <= 3; i++)
		for (int j = 1; j <= 3; j++)
			Identity[i][j] = p[i][j];
}

void Solve()
{
	fin >> X >> Y >> Z;
	fin >> A >> B >> C;
	fin >> N;
	N++;
	Identity[1][1] = 0, Identity[1][2] = 1, Identity[1][3] = 0;
	Identity[2][1] = 0, Identity[2][2] = 0, Identity[2][3] = 1;
	Identity[3][1] = C, Identity[3][2] = B, Identity[3][3] = A;
	vect[1][1] = X, vect[2][1] = Y, vect[3][1] = Z;

	plog(N - 3);
	MultiplyMatrix(Identity, vect, 3, 3, 1);
	ans = Identity[3][1];
	fout << ans << "\n";
}

int main()
{
	int T;
	for (fin >> T; T--;)
		Solve();
	return 0;
}