Cod sursa(job #450083)

Utilizator sapiensCernov Vladimir sapiens Data 7 mai 2010 18:30:32
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.19 kb
#include <fstream>
using namespace std;

ifstream fin; ofstream fout;
short i,T; int a,b,c,A,B,C; long n;
long long un[4][4],doi[4][4];

void transfer () {
     un[0][0]=doi[0][0]; un[0][1]=doi[0][1]; un[0][2]=doi[0][2];
     un[1][0]=doi[1][0]; un[1][1]=doi[1][1]; un[1][2]=doi[1][2];
     un[2][0]=doi[2][0]; un[2][1]=doi[2][1]; un[2][2]=doi[2][2];
}

void sqr () {
     doi[0][0]=(un[0][0]*un[0][0]+un[0][1]*un[1][0]+un[0][2]*un[2][0])%666013;
     doi[0][1]=(un[0][0]*un[0][1]+un[0][1]*un[1][1]+un[0][2]*un[2][1])%666013;
     doi[0][2]=(un[0][0]*un[0][2]+un[0][1]*un[1][2]+un[0][2]*un[2][2])%666013;
     doi[1][0]=(un[1][0]*un[0][0]+un[1][1]*un[1][0]+un[1][2]*un[2][0])%666013;
     doi[1][1]=(un[1][0]*un[0][1]+un[1][1]*un[1][1]+un[1][2]*un[2][1])%666013;
     doi[1][2]=(un[1][0]*un[0][2]+un[1][1]*un[1][2]+un[1][2]*un[2][2])%666013;
     doi[2][0]=(un[2][0]*un[0][0]+un[2][1]*un[1][0]+un[2][2]*un[2][0])%666013;
     doi[2][1]=(un[2][0]*un[0][1]+un[2][1]*un[1][1]+un[2][2]*un[2][1])%666013;
     doi[2][2]=(un[2][0]*un[0][2]+un[2][1]*un[1][2]+un[2][2]*un[2][2])%666013;
     transfer ();
}

void mult () {
     doi[0][0]=un[0][1]; doi[0][1]=un[0][2];
     doi[0][2]=(un[0][0]*A+un[0][1]*B+un[0][2]*C)%666013;
     doi[1][0]=un[1][1]; doi[1][1]=un[1][2];
     doi[1][2]=(un[1][0]*A+un[1][1]*B+un[1][2]*C)%666013;
     doi[2][0]=un[2][1]; doi[2][1]=un[2][2];
     doi[2][2]=(un[2][0]*A+un[2][1]*B+un[2][2]*C)%666013;
     transfer ();
}

void putere (long x) {
     if (x>1) {
        putere (x/2); sqr ();
        if (x%2) mult ();
     }
}

void afisare (long x[4][4]) {
     fout<<x[0][0]<<" "<<x[0][1]<<" "<<x[0][2]<<endl;
     fout<<x[1][0]<<" "<<x[1][1]<<" "<<x[1][2]<<endl;
     fout<<x[2][0]<<" "<<x[2][1]<<" "<<x[2][2]<<endl;
     fout<<endl;
}

int main () {
    fin.open ("iepuri.in"); fout.open ("iepuri.out");
    fin>>T;
    for (i=0; i<T; i++) {
        fin>>a>>b>>c>>C>>B>>A>>n;
        un[0][0]=0; un[0][1]=0; un[0][2]=A;
        un[1][0]=1; un[1][1]=0; un[1][2]=B;
        un[2][0]=0; un[2][1]=1; un[2][2]=C;
        putere (n-2);
        fout<<(a*un[0][2]+b*un[1][2]+c*un[2][2])%666013<<endl;
    }
    fin.close (); fout.close ();
    return 0;
}