Cod sursa(job #969307)

Utilizator Dddarius95Darius-Florentin Neatu Dddarius95 Data 4 iulie 2013 01:44:49
Problema Iepuri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 kb
#include <fstream>
#include <cstring>
#define X 666013
#define D 5
using namespace std;
ifstream f("iepuri.in");
ofstream g("iepuri.out");

int t,x,y,z,a,b,c,n,Z[D][D], Sol[D][D];
//in Sol intra puterea lui Z


//C=A*B  // mod X
void mult(int A[][D], int B[][D], int C[][D])
{
    for (int i = 0; i < 3; i++)
        for (int j = 0; j < 3; j++)
            for (int k = 0; k < 3; k++)
                C[i][j] = (C[i][j] + 1LL * A[i][k] * B[k][j]) % X;
}

void ExponentiereRapida(int P,int Sol[][D])
{
    int C[D][D], AUX[D][D];
    memcpy(C, Z, sizeof(Z));
    Sol[0][0]=Sol[1][1]=Sol[2][2]=1;
    while(P!=1)
    if(P % 2==0)
    {
        memset(AUX, 0, sizeof(AUX));
        mult(C, C, AUX);
        memcpy(C, AUX, sizeof(C));
        P/=2;
    }
    else
    {
        memset(AUX, 0, sizeof(AUX));
        mult(Sol,C,AUX);
        memcpy(Sol,AUX,sizeof(AUX));
        P--;
    }
    memset(AUX, 0, sizeof(AUX));
    mult(C,Sol,AUX);
    memcpy(Sol,AUX,sizeof(AUX));
}

void Solve()
{
    f>>x>>y>>z>>a>>b>>c>>n;
    n-=2;
    Z[0][0]=0; Z[0][1]=1; Z[0][2]=0;
    Z[1][0]=0; Z[1][1]=0; Z[1][2]=1;
    Z[2][0]=c; Z[2][1]=b; Z[2][2]=a;
    memset(Sol,0,sizeof(Sol));
    ExponentiereRapida(n,Sol);
    g<<x*Sol[2][0]+y*Sol[2][1]+z*Sol[2][2]<<'\n';
}
int main()
{
    f>>t;
    for(int i=1;i<=t;i++)Solve();
    f.close();g.close();
    return 0;
}