Cod sursa(job #2857599)

Utilizator Darius_CDarius Chitu Darius_C Data 25 februarie 2022 22:03:50
Problema Iepuri Scor 100
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;
typedef long long ll;

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

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

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

void plog(ll e)
{
	ll 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 (ll i = 1; i <= 3; i++)
		for (ll 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()
{
	ll T;
	for (fin >> T; T--;)
		Solve();
	return 0;
}