Cod sursa(job #1727715)

Utilizator dani_mocanuDani Mocanu dani_mocanu Data 11 iulie 2016 15:25:24
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.33 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("iepuri.in");
ofstream fout("iepuri.out");
int T,X,Y,Z,A,B,C,N;
const int mod = 666013;
int a[5][5],b[5][5],z[5][5];


inline void Copy(int a[5][5],int b[5][5])
{
    for(int i = 1; i <= 3; i++)
        for(int j = 1; j <= 3; j++)
            a[i][j] = b[i][j];
}

inline void Mult_Mat(int a[5][5], int b[5][5])
{
    int i,j,k;
    int c[5][5];
    long long s;
    for(i = 1; i <= 3; i++)
        for(j = 1; j <= 3; j++)
    {
        s = 0;
        for(k = 1; k <= 3; k++)
            s += (1LL * a[i][k] * b[k][j]);
        c[i][j] = s%mod;
    }
    Copy(a,c);
}

inline void Pow_Log(int a[5][5], int p)
{
    int u[5][5];
    Copy(u,z);
    u[1][1] = u[2][2] = u[3][3] = 1;
    while(p)
    {
        if(p & 1)
        {
            p--;
            Mult_Mat(u,a);
        }
        p/=2;
        Mult_Mat(a,a);
    }
    Copy(a,u);
}

inline void Solve()
{
    Copy(a,z);
    Copy(b,z);
    b[2][1] = b[3][2] = 1;
    b[1][3] = C, b[2][3] = B, b[3][3] = A;
    a[1][1] = X, a[1][2] = Y, a[1][3] = Z;
    Pow_Log(b,N-2);
    Mult_Mat(a,b);
    fout << a[1][3] << "\n";
}

int main()
{
    fin >> T;
    while(T--)
    {
        fin >> X >> Y >> Z >> A >> B >> C >> N;
        Solve();
    }
    fout.close();
    return 0;
}