Cod sursa(job #1208422)

Utilizator PlatenitesVoicu Cristian Platenites Data 15 iulie 2014 18:07:57
Problema Iepuri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.32 kb
#include <fstream>

using namespace std;

ifstream f("iepuri.in");
ofstream g("iepuri.out");
int x,y,z,a,b,c,n,A[4][4],m,B[4][4],sol[4][4],sol2[4][4],t;
void inm(int B[][4],int A[][4])
{
    B[1][1]=(A[1][1]*A[1][1])+(A[1][2]*A[2][1])+(A[1][3]*A[3][1]);
    B[1][2]=(A[1][1]*A[1][2])+(A[1][2]*A[2][2])+(A[1][3]*A[3][2]);
    B[1][3]=(A[1][1]*A[1][3])+(A[1][2]*A[2][3])+(A[1][3]*A[3][3]);
    B[2][1]=(A[2][1]*A[1][1])+(A[2][2]*A[2][2])+(A[2][3]*A[3][1]);
    B[2][2]=(A[2][1]*A[1][2])+(A[2][2]*A[2][2])+(A[2][3]*A[3][2]);
    B[2][3]=(A[2][1]*A[1][3])+(A[2][2]*A[2][3])+(A[2][3]*A[3][3]);
    B[3][1]=(A[3][1]*A[1][1])+(A[3][2]*A[2][1])+(A[3][3]*A[3][1]);
    B[3][2]=(A[3][1]*A[1][2])+(A[3][2]*A[2][2])+(A[3][3]*A[3][2]);
    B[3][3]=(A[3][1]*A[1][3])+(A[3][2]*A[2][3])+(A[3][3]*A[3][3]);
}
void inm2(int C[][4],int B[][4],int A[][4])
{
    C[1][1]=(B[1][1]*A[1][1])+(B[1][2]*A[2][1])+(B[1][3]*A[3][1]);
    C[1][2]=(B[1][1]*A[1][2])+(B[1][2]*A[2][2])+(B[1][3]*A[3][2]);
    C[1][3]=(B[1][1]*A[1][3])+(B[1][2]*A[2][3])+(B[1][3]*A[3][3]);
    C[2][1]=(B[2][1]*A[1][1])+(B[2][2]*A[2][1])+(B[2][3]*A[3][1]);
    C[2][2]=(B[2][1]*A[1][2])+(B[2][2]*A[2][2])+(B[2][3]*A[3][2]);
    C[2][3]=(B[2][1]*A[1][3])+(B[2][2]*A[2][3])+(B[2][3]*A[3][3]);
    C[3][1]=(B[3][1]*A[1][1])+(B[3][2]*A[2][1])+(B[3][3]*A[3][1]);
    C[3][2]=(B[3][1]*A[1][2])+(B[3][2]*A[2][2])+(B[3][3]*A[3][2]);
    C[3][3]=(B[3][1]*A[1][3])+(B[3][2]*A[2][3])+(B[3][3]*A[3][3]);
}
void atrib(int A[][4],int B[][4])
{
    for(int i=1;i<=3;i++)
        for(int j=1;j<=3;j++)
            A[i][j]=B[i][j];
}
int main()
{
    f>>t;
    for(int i=1;i<=t;i++)
    {
        f>>x>>y>>z>>a>>b>>c>>n;
        m=n-2;
        A[1][1]=a;A[1][2]=b;A[1][3]=c;
        A[2][1]=1;A[2][2]=0;A[2][3]=0;
        A[3][2]=1;A[3][1]=0;A[3][3]=0;
        sol[1][1]=sol[2][2]=sol[3][3]=1;
        sol[1][2]=sol[1][3]=sol[2][1]=sol[2][3]=sol[3][1]=sol[3][2]=0;
        B[1][2]=B[1][3]=B[2][1]=B[2][3]=B[3][1]=B[3][2]=0;
        B[1][1]=B[2][2]=B[3][3]=1;
        while(m!=0)
        {
            int r=m%2;
            if(r==1)
            {
                atrib(sol2,sol);
                inm2(sol,sol2,A);
            }
            inm(B,A);
            atrib(A,B);
            m=m/2;
        }
        g<<z*sol[1][1]+y*sol[1][2]+x*sol[1][3]<<'\n';
    }
    return 0;
}