Pagini recente » Diferente pentru info-oltenia-2018/individual/10 intre reviziile 5 si 2 | Istoria paginii summer-challenge-2009/clasament/runda-3 | Atasamentele paginii dau_pentru_aluprej | Cod sursa (job #698263) | Cod sursa (job #2178380)
#include <fstream>
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
#define FILENAME "iepuri"
const int kMod = 666013;
class Matrice {
public:
long long m[3][3];
Matrice() {
int i, j;
for (i = 0; i < 3; ++i) {
for (j = 0; j < 3; ++j) {
m[i][j] = 0;
}
}
}
Matrice operator*= (Matrice &b) {
Matrice res;
int i, j, k;
for (i = 0; i < 3; ++i) {
for (j = 0; j < 3; ++j) {
res.m[i][j] = 0;
for (k = 0; k < 3; ++k){
res.m[i][j] = (res.m[i][j] + this->m[i][k] * b.m[k][j]) % kMod;
}
}
}
for (i = 0; i < 3; ++i) {
for (j = 0; j < 3; ++j) {
this->m[i][j] = res.m[i][j];
}
}
return res;
}
Matrice operator* (Matrice &b) {
Matrice res;
int i, j, k;
for (i = 0; i < 3; ++i) {
for (j = 0; j < 3; ++j) {
res.m[i][j] = 0;
for (k = 0; k < 3; ++k){
res.m[i][j] = (res.m[i][j] + this->m[i][k] * b.m[k][j]) % kMod;
}
}
}
return res;
}
};
class Task {
public:
void solve() {
read_input();
print_output(get_result());
}
private:
int x[100], y[100], z[100];
int a[100], b[100], c[100];
int n[100];
int res[100];
int T;
void read_input() {
ifstream fin(FILENAME".in");
fin >> T;
for (int i = 0; i < T; ++i) {
fin >> x[i] >> y[i] >> z[i] >> a[i] >> b[i] >> c[i] >> n[i];
}
fin.close();
}
int get_result() {
for (int i = 0; i < T; ++i) {
if (n[i] >= 2) {
Matrice mat = powerMat(n[i] - 2, c[i], b[i], a[i]);
res[i] = ((x[i] * mat.m[2][0]) % kMod + (y[i] * mat.m[2][1]) % kMod + (z[i] * mat.m[2][2]) % kMod) % kMod;
}
}
}
void print_output(int result) {
ofstream fout(FILENAME".out");
for (int i = 0; i < T; ++i) {
fout << res[i] << '\n';
}
//cout << result << '\n';
fout.close();
}
Matrice powerMat(int n, int a, int b, int c) {
Matrice I;
Matrice Base;
I.m[0][0] = I.m[1][1] = I.m[2][2] = 1;
Base.m[0][1] = Base.m[1][2] = 1;
Base.m[2][2] = c;
Base.m[2][1] = b;
Base.m[2][0] = a;
for (int i = 1; i <= n; i <<= 1) {
if (i & n) {
//I = (I * Base);
I *= Base;
}
//Base = (Base * Base);
Base *= Base;
}
return I;
}
};
int main() {
Task task;
task.solve();
return 0;
}