Cod sursa(job #2632150)

Utilizator Wister1043Silaghi Razvan-Andrei Wister1043 Data 2 iulie 2020 13:28:35
Problema Iepuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.02 kb
#include <fstream>

using namespace std;

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

const long long MOD = 666013;

struct Mat
{
    int mat[3][3];
};

const Mat nullMat =
{
    {{1,0,0},
    {0,1,0},
    {0,0,1}}

};

Mat prod(Mat a, Mat b)
{
    Mat ret;
    ret.mat[0][0] = (1ll*a.mat[0][0]*b.mat[0][0] + 1ll*a.mat[0][1]*b.mat[1][0] + 1ll*a.mat[0][2]*b.mat[2][0]) % MOD;
    ret.mat[0][1] = (1ll*a.mat[0][0]*b.mat[0][1] + 1ll*a.mat[0][1]*b.mat[1][1] + 1ll*a.mat[0][2]*b.mat[2][1]) % MOD;
    ret.mat[0][2] = (1ll*a.mat[0][0]*b.mat[0][2] + 1ll*a.mat[0][1]*b.mat[1][2] + 1ll*a.mat[0][2]*b.mat[2][2]) % MOD;
    ret.mat[1][0] = (1ll*a.mat[1][0]*b.mat[0][0] + 1ll*a.mat[1][1]*b.mat[1][0] + 1ll*a.mat[1][2]*b.mat[2][0]) % MOD;
    ret.mat[1][1] = (1ll*a.mat[1][0]*b.mat[0][1] + 1ll*a.mat[1][1]*b.mat[1][1] + 1ll*a.mat[1][2]*b.mat[2][1]) % MOD;
    ret.mat[1][2] = (1ll*a.mat[1][0]*b.mat[0][2] + 1ll*a.mat[1][1]*b.mat[1][2] + 1ll*a.mat[1][2]*b.mat[2][2]) % MOD;
    ret.mat[2][0] = (1ll*a.mat[2][0]*b.mat[0][0] + 1ll*a.mat[2][1]*b.mat[1][0] + 1ll*a.mat[2][2]*b.mat[2][0]) % MOD;
    ret.mat[2][1] = (1ll*a.mat[2][0]*b.mat[0][1] + 1ll*a.mat[2][1]*b.mat[1][1] + 1ll*a.mat[2][2]*b.mat[2][1]) % MOD;
    ret.mat[2][2] = (1ll*a.mat[2][0]*b.mat[0][2] + 1ll*a.mat[2][1]*b.mat[1][2] + 1ll*a.mat[2][2]*b.mat[2][2]) % MOD;
    return ret;
}

Mat rid(Mat a, int N)
{
    if(!N)
    {
        return nullMat;
    }
    else
    {
        if(N%2)
        {
            return prod(a,rid(prod(a,a),N/2));
        }
        else
        {
            return rid(prod(a,a),N/2);
        }
    }
}

int main()
{
    int T;
    int X,Y,Z,A,B,C;
    long long N;
    fin>>T;
    for(int i=1;i<=T;i++)
    {
        fin>>X>>Y>>Z>>A>>B>>C>>N;
            Mat m =
            {
                {{A,B,C},
                {1,0,0},
                {0,1,0}}

            };
            m = rid(m,N-2);
            fout<<(1ll*Z*m.mat[0][0]+1ll*Y*m.mat[0][1]+1ll*X*m.mat[0][2])%MOD<<endl;
    }
    return 0;
}