Cod sursa(job #2264291)

Utilizator Catalin_BorzaBorza Catalin-Mihai Catalin_Borza Data 19 octombrie 2018 23:35:04
Problema Iepuri Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.65 kb
#include <iostream>
#include <fstream>

using namespace std;

class Vector
{
private:
	long long *vector;
	long long n;
public:
	Vector();
	Vector(long long n);
	Vector(Vector &V);

	long long &operator[] (long long i);
	long long Length();

	void init(long long n);
};

long long Vector::Length()
{
	return this->n;
}

Vector::Vector()
{
	init(1);
}

Vector::Vector(long long n)
{
	init(n);
}

Vector::Vector(Vector &V) : n(V.n)
{
	for (long long i = 0; i < n; i++)
		this[i] = V[i];
}

long long &Vector::operator[] (long long i)
{
	return vector[i];
}

void Vector::init(long long n)
{
	vector = new long long[n] {0};
	this->n = n;
}

class Matrix
{
private:
	Vector * matrix;
	long long n;
	void init(long long n);
public:
	Matrix(long long n);
	Matrix(Matrix &M);

	Matrix operator*(const Matrix &M);
	Matrix operator%(long long p);

	Matrix power(long long p);
	Vector & operator[](long long i);
};

void Matrix::init(long long n)
{
	matrix = new Vector[n];
	this -> n = n;
	for (long long i = 0; i < n; i++)
		matrix[i].init(n);
}

Matrix::Matrix(long long n)
{
	init(n);
}


Matrix::Matrix(Matrix &M)
{
	if (n != M.n)
		init(M.n);
	for (long long i = 0; i < n; i++)
		for (long long j = 0; j < n; j++)
			matrix[i][j] = M.matrix[i][j];
}

Matrix Matrix::operator*(const Matrix &M)
{
	Matrix R(n);
	for (long long i = 0; i < n; i++)
		for (long long j = 0; j < n; j++)
			for (long long k = 0; k < n; k++)
				R[i][j] += matrix[i][k] * M.matrix[k][j];
	return R;
}

Matrix Matrix::operator%(long long p)
{
	Matrix R(n);
	for (long long i = 0; i < n; i++)
		for (long long j = 0; j < n; j++)
			R[i][j] = matrix[i][j] % p;
	return R;
}

Matrix Matrix::power(long long p)
{
	Matrix X = *this;
	while (!(p & 1))
	{
		X = X * X;
		p /= 2;
	}
	Matrix R = X;
	p--;
	while (p)
	{
		if (p & 1)
		{
			R = R * X;
			p--;
		}
		else
		{
			X = X * X;
			p /= 2;
		}
	}
	return R;
}

Vector & Matrix::operator[](long long i)
{
	return matrix[i];
}

int main()
{
    int x, y, z, A, B, C, N, T;
    Matrix F(3), M(3);
    ifstream f("iepuri.in");
    ofstream g("iepuri.out");
    for (int i = 1; i < 3; i ++)
        for (int j = 0; j < 3; j ++)
            F[i][j] = 0;
    f >> T;
    for (int i = 0; i < T; i ++)
    {
        f >> x >> y >> z >> A >> B >> C >> N;
        M[0][0] = M[0][1] = M[1][1] = M[2][0] = 0;
        M[1][0] = M[2][1] = 1;
        M[0][2] = C;
        M[1][2] = B;
        M[2][2] = A;
        F[0][0] = x;
        F[0][1] = y;
        F[0][2] = z;
        g << (F * M.power(N - 2))[0][2] << "\n";
    }
    return 0;
}