Cod sursa(job #1343324)

Utilizator assa98Andrei Stanciu assa98 Data 15 februarie 2015 12:23:45
Problema Iepuri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.49 kb
#include <fstream>
#include <algorithm>
#include <cstring>
using namespace std;

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

class mat {
private:
    static const int MOD = 666013;
    int a[3][3];
public:
    mat() {
        memset(a, 0, sizeof(a));
        a[0][0] = a[1][1] = a[2][2] = 1;
    }

    mat(int x, int y, int z, bool t) {
        memset(a, 0, sizeof(a));
        if(t) {
            a[0][0] = x;
            a[0][1] = y;
            a[0][2] = z;
        }
        else {
            a[0][2] = x;
            a[1][2] = y;
            a[2][2] = z;
            a[1][0] = a[2][1] = 1;
        }
    }

    mat operator * (const mat &o) const {
        mat ans(0, 0, 0, true);
        for(int i = 0; i < 3; i++) {
            for(int j = 0; j < 3; j++) {
                for(int k = 0; k < 3; k++) {
                    ans.a[i][j] = ((long long)ans.a[i][j] + a[i][k] * o.a[k][j]) % MOD;
                }
            }
        }
        return ans;
    }

    int getAns() {
        return a[0][2];
    }
};

mat put(const mat &a, int p) {
    if(p == 0) {
        return mat();
    }
    if(p & 1) {
        return put(a, p - 1) * a;
    }
    mat b = put(a, p / 2);
    return b * b;
}

int main() {
    int t;
    for(fin >> t; t; t--) {
        int a, b, c, x, y, z, n;
        fin >> a >> b >> c >> x >> y >> z >> n;

        mat ans(a, b, c, true);
        mat r(z, y, x, false);

        r = put(r, n - 2);
        ans = ans * r;
        fout << ans.getAns() << '\n';
    }
    return 0;
}