Cod sursa(job #1019681)

Utilizator Impaler_009Mihai Nitu Impaler_009 Data 31 octombrie 2013 19:27:41
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.42 kb
#include <fstream>
#include <cstring>

#define ll long long
#define mod 666013

using namespace std;


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

ll a,b,c,x,y,z;
int n,t;

void initialize (ll m[][3])
{
    m[0][0] = a;
    m[1][0] = b;
    m[2][0] = c;
    m[0][1] = 1;
    m[1][2] = 1;
}

void matrix_power (ll m[][3], int p)
{
    if (p==1)
    {
        initialize (m);
        return;
    }

    ll send[3][3],temp[3][3];
    memset (send,0,sizeof(send));
    memset (temp,0,sizeof(temp));

    matrix_power (send,p/2);

    for (int i=0; i<3; ++i)
        for (int j=0; j<3; ++j)
           for (int k=0; k<3; ++k)
    {
        temp[i][j] += (send[i][k]*send[k][j])%mod;
        if (temp[i][j] >= mod) temp[i][j] -= mod;
    }

    if (p%2)
    {
        ll u[3][3];
        memset (u,0,sizeof(u));
        initialize(u);

        for (int i=0; i<3; ++i)
        for (int j=0; j<3; ++j)
           for (int k=0; k<3; ++k)
    {
        m[i][j] += (temp[i][k]*u[k][j])%mod;
        if (m[i][j] >= mod) m[i][j] -= mod;
    }
    }
    else
    {
        memcpy (m,temp,sizeof(temp));
    }
}

int main()
{
    fin>>t;

    for (;t; --t)
    {
        fin>>x>>y>>z>>a>>b>>c>>n;

        ll m[3][3];

        memset (m,0,sizeof(m));

        matrix_power (m,n-2);

        fout<<((z*m[0][0])%mod + (y*m[1][0])%mod + (x*m[2][0])%mod)%mod<<"\n";
    }
}