Cod sursa(job #2178229)

Utilizator PhilipDumitruPhilip Dumitru PhilipDumitru Data 19 martie 2018 11:48:25
Problema Iepuri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.27 kb
#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[0][0] = 0;
            }
        }
    }
    
    Matrice operator* (Matrice &a, Matrice &b) {
        Matrice res;
        int i, j, k;
        for (i = 0; i < 3; ++i) {
            for (j = 0; j < 3; ++j) {
                res[i][j] = 0;
                for (k = 0; k < 3; ++k){
                    res[i][j] = (res[i][j] + a[i][k] * b[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) {
            Matrice mat = powerMat(n[i] - 2, a[i], b[i], c[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][0] = 1;
        Base.m[2][2] = c;
        Base.m[2][1] = b;
        Base.m[2][0] = a;
        for (int i = 1; i <= x; i <<= 1) {
            if (i & x) {
                I = (I * Base) % kMod;
            }
            base = (Base * Base) % kMod;
        }
        return I;
    }
};

int main() {
    Task task;
    task.solve();
    return 0;
}