Cod sursa(job #2443466)

Utilizator vladth11Vlad Haivas vladth11 Data 28 iulie 2019 10:11:45
Problema Iepuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.68 kb
#include <fstream>

using namespace std;
ifstream cin("iepuri.in");
ofstream cout("iepuri.out");
const int MOD = 666013;
struct matrice
{
    long long m[3][3];
    void clearr()
    {
        for(int i = 0; i < 3; i++)
        {
            for(int j = 0; j < 3; j++)
            {
                m[i][j] = 0;
            }
        }
    }
    matrice operator * (matrice const a)
    const
    {
        matrice rez;
        rez.clearr();
        for(int i = 0; i < 3; i++)
        {
            for(int j = 0; j < 3; j++)
            {
                rez.m[i][j] = 0;
                for(int k = 0; k < 3; k++)
                {
                    rez.m[i][j] += m[i][k] * a.m[k][j];
                    rez.m[i][j] %= MOD;
                }
            }

        }
        return rez;
    }
};
matrice exp(matrice n,int p)
{
    matrice rest;
    int i,j;
    for(i = 0; i < 3; i++)
        for(j = 0; j < 3; j++)
        {
            rest.m[i][j] = n.m[i][j];
        }
    while(p)
    {
        if(p % 2)
        {
            rest = rest * n;
        }
        n = n * n;
        p >>= 1;
    }
    /*
    }*/
    return rest;
}
int main()
{
    int q,i,j;
    cin >> q;
    while(q--)
    {
        long long x,y,z,a,b,c,n;
        cin >> x >> y >> z >> a >> b >> c >> n;
        matrice init;
        init.m[0][1] = b;
        init.m[0][0] = a;
        init.m[0][2] = c;
        init.m[1][0] = init.m[2][1] = 1;
        init.m[1][1] = init.m[1][2] = init.m[2][0] = init.m[2][2] = 0;
        cout << (exp(init,n - 3).m[0][0] * z + exp(init,n - 3).m[0][1] * y + exp(init,n - 3).m[0][2] * x) % MOD << "\n";
    }
    return 0;
}