Cod sursa(job #2634170)

Utilizator stefan.popescuPopescu Stefan stefan.popescu Data 9 iulie 2020 23:13:22
Problema Iepuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.49 kb
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
const int mod=666013;
class Matrix
{
public:
    typedef long long size_var; ///schimba long long cu int sau un obiect daca trebuie

    vector < vector < size_var > >  mat;

    int  const lines () ///pentru assignment
    const {
        return mat.size()-1;
    }
    int  const columns () ///pentru assignment
    const {
        return mat[0].size()-1;
    }

    void makeUnitary()
    {
        ///doar pentru matrici patratice, altfel da eroare
        mat=vector<vector<size_var> > (lines()+1, vector<size_var> (columns()+1, 0));
        for(int i=1; i<=lines(); i++)
            mat[i][i]=1;
    }

    Matrix (int const & n, int const & m, size_var const & val=0)
    {
        mat= vector< vector <size_var> > (n+1, vector <size_var>(m+1, val));
    }

    vector<size_var> & operator [] (int const & t1)
    &{
        return mat[t1];
    }
    Matrix operator * (Matrix const & mati2)
    {
        ///se presupune ca m1=n2;
        Matrix rez(lines(), mati2.columns());
        for(int i=1; i<=lines(); i++)
            for(int j=1; j<=mati2.columns(); j++)
            {
                size_var rezi=0;
                for(int q=1; q<=columns(); q++)
                {

                    rezi+=mat[i][q]*mati2.mat[q][j];
                    rezi%=mod;
                    ///^daca e necesar modulo^
                }
                rez[i][j]=rezi;
            }
        return rez;
    }

    void operator *= (Matrix const & mati2)
    {
        ///se presupune ca m1=n2;
        Matrix rez(lines(), mati2.columns());
        rez=(*this)*mati2;
        this->mat=rez.mat;
    }
    Matrix operator ^ (size_var const & put) ///pow
    {
        Matrix rez(lines(), lines());
        size_var ptt=put;
        Matrix mat1=(*this);
        rez.makeUnitary();
        while(ptt)
        {
            if(ptt&1) rez*=mat1;
            mat1*=mat1; ptt>>=1;
        }
        return rez;
    }
};
ifstream in ("iepuri.in");
ofstream out("iepuri.out");
int queries, X, Y, Z, A, B, C, N;
int main()
{
    in>>queries;
    while(queries--)
    {
        in>>X>>Y>>Z>>A>>B>>C>>N;
        Matrix mat(3, 3);
        mat[1][1]=A; mat[1][2]=B; mat[1][3]=C; mat[2][1]=1; mat[3][2]=1;

        Matrix reza=mat^(N-2);
        Matrix rez(3, 1);

        rez[1][1]=Z; rez[2][1]=Y; rez[3][1]=X;

        reza*=rez;

        out<<reza[1][1]<<"\n";
    }
    return 0;
}