Cod sursa(job #1801538)

Utilizator BlackNestaAndrei Manaila BlackNesta Data 9 noiembrie 2016 09:49:41
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.7 kb
#include <bits/stdc++.h>
#define Modulo 666013

using namespace std;

int a, b, c, n, x, y, z, ans, t;
int m[4][4], mm[4][4];
int aux[4][4];

ofstream g("iepuri.out");

inline void Solve();

inline void Read()
{
    ifstream f("iepuri.in");
    f >> t;
    for(int i = 1; i <= t; i++)
    {
        f >> x >> y >> z >> a >> b >> c >> n;
        Solve();
    }
    f.close();
}

inline void Copy(int m[4][4], int mm[4][4])
{
    for(int i = 1; i <= 3; i++)
        for(int j = 1; j <= 3; j++)
            m[i][j] = mm[i][j];
}

inline void Mat_Mult(int m[4][4], int mm[4][4])
{
    int mmm[4][4];
    int i, j, k, s;
    for(i = 1; i <= 3; i++)
        for(j = 1; j <= 3; j++)
        {
            s = 0;
            for(k = 1; k <= 3; k++)
                s = (s + 1LL * m[i][k] * mm[k][j]) % Modulo;
            mmm[i][j] = s;
        }
    Copy(m, mmm);
}

inline void Mat_Lg_Pow(int m[4][4], int p)
{
    int mmm[4][4];
    Copy(mmm, aux);
    mmm[1][1] = mmm[2][2] = mmm[3][3] = 1;
    while(p)
    {
        if(p % 2 == 1)
        {
            Mat_Mult(mmm, m);
            p--;
        }
        Mat_Mult(m, m);
        p /= 2;
    }
    Copy(m, mmm);
}

inline void Solve()
{
    Copy(m, aux);
    Copy(mm, aux);
    m[1][1] = x;
    m[1][2] = y;
    m[1][3] = z;
    if(n < 4)
        ans = m[1][n];
    else
    {
        mm[1][3] = c;
        mm[2][3] = b;
        mm[3][3] = a;
        mm[2][1] = mm[3][2] = 1;
        mm[1][2] = mm[1][1] = mm[2][2] = mm[3][1] = 0;
        Mat_Lg_Pow(mm, n - 2);
        Mat_Mult(m, mm);
        ans = m[1][3];
    }
    g << ans << "\n";
}

int main()
{
    Read();
    g.close();
    return 0;
}