Cod sursa(job #2766446)

Utilizator tryharderulbrebenel mihnea stefan tryharderul Data 1 august 2021 18:06:56
Problema Iepuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.42 kb
#include <bits/stdc++.h>

#define MOD 666013

using namespace std;

class Matrix {
private:
    vector<vector<int>> M;
public:
    Matrix(int n, int m) {
        M.resize(n, vector<int>(m, 0));
    }

    int get(int i, int j) {
        return M[i][j];
    }

    void set(int i, int j, int val) {
        M[i][j] = val;
    }

    int lines() {
        return M.size();
    }

    int columns() {
        return M[0].size();
    }

    friend Matrix operator + (Matrix A, const Matrix& B) {
        assert(A.M.size() == B.M.size() && A.M[0].size() == B.M[0].size());
        for(size_t i = 0; i < A.M.size(); i++) {
            for(size_t j = 0; j < A.M[0].size(); j++) {
                A.M[i][j] = (A.M[i][j] + B.M[i][j]) % MOD;
            }
        }
        return A;
    }
    friend Matrix operator * (Matrix A, const Matrix& B) {
        assert(A.M[0].size() == B.M.size());
        Matrix C(A.M.size(), B.M[0].size());
        for(size_t i = 0; i < A.M.size(); i++) {
            for(size_t j = 0; j < B.M[0].size(); j++) {
                for(size_t k = 0; k < A.M[0].size(); k++) {
                    C.M[i][j] = (C.M[i][j] + 1LL * A.M[i][k] * B.M[k][j]) % MOD;
                }
            }
        }
        return C;
    }
};

Matrix logPow(Matrix base, int exp) {
    assert(base.lines() == base.columns());

    Matrix ans(base.lines(), base.columns());
    ans.set(0, 0, 1);
    ans.set(1, 1, 1);
    for(int i = 0; i <= 30; i++) {
        if(exp & (1 << i)) {
            ans = ans * base;
        }
        base = base * base;
    }

    return ans;
}

void printMat(Matrix mat) {
    for(int i = 0; i < mat.lines(); i++) {
        for(int j = 0; j < mat.columns(); j++) {
            printf("%d ", mat.get(i, j));
        }
        printf("\n");
    }
}

void test_case() {
    int x,y,z,a,b,c,n;
    scanf("%d %d %d",&x,&y,&z);
    scanf("%d %d %d",&a,&b,&c);
    scanf("%d",&n);
    Matrix base(3,3);
    base.set(0,1,1);
    base.set(1,2,1);
    base.set(2,0,c);
    base.set(2,1,b);
    base.set(2,2,a);
    Matrix start(3,1);
    start.set(0,0,x);
    start.set(1,0,y);
    start.set(2,0,z);
    printf("%d\n",(logPow(base, n) * start).get(0,0) );


}

int main()
{
    freopen("iepuri.in","r",stdin);
    freopen("iepuri.out","w",stdout);
    int t;
    scanf("%d",&t);
    while(t--) {
        test_case();
    }

    return 0;
}