Cod sursa(job #2554383)

Utilizator ardutgamerAndrei Bancila ardutgamer Data 22 februarie 2020 20:48:14
Problema Iepuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.04 kb
#include <iostream>
#include <vector>
#include <algorithm>
#include <fstream>

using namespace std;

const long long MOD = 666013;

class matrix {
private:
	int n, m;
public:
	vector<vector<int> >a;

	matrix()
	{
		m = n = 0;
	}

	matrix(int x, int y)
	{
		m = x;
		n = y;
		for (int i = 0; i < x; i++)
		{
			vector<int>v(y);
			a.push_back(v);
		}
	}

	matrix operator*(const matrix& other)
	{
		matrix v(m, other.n);
		for (int i = 0; i < m; i++)
			for (int j = 0; j < n; j++)
				for (int k = 0; k < other.n; k++) {
					long long val = 1ll * v.a[i][k] + 1ll * a[i][j] * other.a[j][k];
					val %= MOD;
					v.a[i][k] = (int)val;
				}
		return v;
	}

	matrix operator=(const matrix& other)
	{
		a.clear();
		m = other.m;
		n = other.n;
		for (int i = 0; i < m; i++)
		{
			vector<int>v(n);
			a.push_back(v);
		}
		for (int i = 0; i < other.m; i++)
		{
			for (int j = 0; j < other.n; j++)
				a[i][j] = other.a[i][j];
		}
		return *this;
	}

	void print()
	{
		for (int i = 0; i < m; i++)
		{
			for (int j = 0; j < n; j++)
				cout << a[i][j] << " ";
			cout << "\n";
		}
		cout << "\n";
	}

};

matrix lgput(matrix n, long long p)
{
	matrix a;
	matrix sol(3, 3);
	sol.a[0][0] = 1;
	sol.a[1][1] = 1;
	sol.a[2][2] = 1;
	a = n;
	for (long long i = 0; (1ll << i) <= p; i++)
	{
		if (p & (1 << i))
			sol = sol * a;
		a = a * a;
	}
	return sol;
}

int x, y, z, a, b, c, n;

int main()
{
	ifstream cin("iepuri.in");
	ofstream cout("iepuri.out");

	int t;
	cin >> t;
	while (t--)
	{

		cin >> x >> y >> z >> a >> b >> c >> n;

		matrix xyz(1, 3);
		matrix be(3, 3);

		be.a[0][0] = a;
		be.a[1][0] = b;
		be.a[2][0] = c;
		be.a[0][1] = 1;
		be.a[1][2] = 1;

		xyz.a[0][0] = z;
		xyz.a[0][1] = y;
		xyz.a[0][2] = x;

		matrix sol = (xyz * lgput(be, 1ll*n - 3ll));

		long long sum = 0;

		sum += (1ll*sol.a[0][0]*a);
		sum %= MOD;
		sum += (1ll*sol.a[0][1]*b);
		sum %= MOD;
		sum += (1ll*sol.a[0][2]*c);
		sum %= MOD;

		cout << sum << "\n";

	}
	return 0;
}