Cod sursa(job #2178380)

Utilizator PhilipDumitruPhilip Dumitru PhilipDumitru Data 19 martie 2018 13:41:44
Problema Iepuri Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.9 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[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;
}