Cod sursa(job #3143227)

Utilizator andrei_C1Andrei Chertes andrei_C1 Data 28 iulie 2023 11:42:30
Problema Iepuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.34 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("iepuri.in");
ofstream fout("iepuri.out");

const int MOD = 666013;

void addSelf(int &a, int b) {
	a += b;
	if(a >= MOD) {
		a -= MOD;
	}
}

void multSelf(int &a, int b) {
	a = (long long) a * b % MOD;
}

int mult(int a, int b) {
	multSelf(a, b);
	return a;
}

vector<vector<int>> mult(const vector<vector<int>> &a, const vector<vector<int>> &b) {
	vector<vector<int>> c(a.size(), vector<int> (b.front().size()));
	for(int i = 0; i < (int) a.size(); i++) {
		for(int k = 0; k < (int) b.size(); k++) if(a[i][k] != 0) {
			for(int j = 0; j < (int) b.front().size(); j++) {
				addSelf(c[i][j], mult(a[i][k], b[k][j]));
			}
		}
	}
	return c;
}

vector<vector<int>> lgpow(vector<vector<int>> a, int b) {
	vector<vector<int>> c(a.size(), vector<int> (a.front().size()));
	for(int i = 0; i < (int) c.size(); i++) {
		c[i][i] = 1;
	}
	while(b) {
		if(b & 1) {
			c = mult(c, a);
		}
		a = mult(a, a);
		b >>= 1;
	}
	return c;
}

void solve() {
	int x, y, z, a, b, c, n;
	fin >> x >> y >> z >> a >> b >> c >> n;
	vector<vector<int>> A(1, vector<int>(3));
	A[0] = {x, y, z};
	vector<vector<int>> B(3, vector<int>(3));
	B[1][0] = B[2][1] = 1;
	B[0][2] = c;
	B[1][2] = b;
	B[2][2] = a;
	B = lgpow(B, n);
	A = mult(A, B);
	fout << A[0][0] << '\n';
}

int main() {
	int tc;
	fin >> tc;
	while(tc--) {
		solve();
	}
	return 0;
}