Cod sursa(job #2665603)

Utilizator razvanradulescuRadulescu Razvan razvanradulescu Data 31 octombrie 2020 09:58:04
Problema Iepuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.65 kb
#include <fstream>
#define MOD 666013
using namespace std;

ifstream f("iepuri.in");
ofstream g("iepuri.out");

const int MAT_SIZE = 3;

struct matrix
{
    long long mat[4][4];

    void initBase(int A, int B, int C)
    {
        mat[0][0] = 0;
        mat[0][1] = 0;
        mat[0][2] = C;
        mat[1][0] = 1;
        mat[1][1] = 0;
        mat[1][2] = B;
        mat[2][0] = 0;
        mat[2][1] = 1;
        mat[2][2] = A;
    }

    void initI()
    {
        mat[0][0] = 1;
        mat[0][1] = 0;
        mat[0][2] = 0;
        mat[1][0] = 0;
        mat[1][1] = 1;
        mat[1][2] = 0;
        mat[2][0] = 0;
        mat[2][1] = 0;
        mat[2][2] = 1;
    }
};

matrix inmultire(matrix a, matrix b)
{
    matrix c;
    for(int i = 0; i < MAT_SIZE; i++)
    {
        for(int j = 0; j < MAT_SIZE; j++)
        {
            c.mat[i][j] = 0;
            for(int k = 0; k < MAT_SIZE; k++)
            {
                c.mat[i][j] = (c.mat[i][j] + a.mat[i][k] * b.mat[k][j]) % MOD;
            }
        }
    }
    return c;
}

matrix ridPutLog(matrix m, int put)
{
    matrix rez;
    rez.initI();
    while(put)
    {
        if((put & 1) == 1)
        {
            rez = inmultire(rez, m);
        }
        m = inmultire(m, m);
        put /= 2;
    }
    return rez;
}

int main()
{
    int T;
    f>>T;
    for(int i = 0; i<T; i++)
    {
        int X, Y, Z, A, B, C, N;
        f>>X>>Y>>Z>>A>>B>>C>>N;
        matrix m;
        m.initBase(A, B, C);
        m = ridPutLog(m, N-2);
        g<<(m.mat[0][2] * X + m.mat[1][2] * Y + m.mat[2][2] * Z) % MOD<<"\n";
    }
    return 0;
}