Cod sursa(job #1791883)

Utilizator topala.andreiTopala Andrei topala.andrei Data 29 octombrie 2016 20:07:28
Problema Iepuri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.3 kb
#include <iostream>
#include <fstream>
#include <string.h>
using namespace std;
ifstream f("iepuri.in");
ofstream g("iepuri.out");
long long M[5][5];
void mult(long long A[][5],long long B[][5],long long C[][5])
{
    int i,j,k;
    for (i=1;i<=3;i++)
        for (j=1;j<=3;j++)
            for (k=1;k<=3;k++)
                 C[i][j] = (C[i][j] + 1LL * A[i][k] * B[k][j]);
}
int main()
{
    long long T,i,x,y,z,a,b,c,N,p,j;
    long long SOL[5][5],C[5][5],AUX[5][5];
    f>>T;
    for (i=1;i<=T;i++)
    {
        memset(C,0,sizeof(C));
        f>>x>>y>>z>>a>>b>>c>>N;
        M[1][1]=0;M[1][2]=1;M[1][3]=0;
        M[2][1]=0;M[2][2]=0;M[2][3]=1;
        M[3][1]=c;M[3][2]=b;M[3][3]=a;

        SOL[1][1]=1;SOL[1][2]=0;SOL[1][3]=0;
        SOL[2][1]=0;SOL[2][2]=1;SOL[2][3]=0;
        SOL[3][1]=0;SOL[3][2]=0;SOL[3][3]=1;

        memcpy(C,M,sizeof(M));
        p=N;
        for (j=0;(1LL<<j)<=p;j++)
        {
            if (p&(1<<j))
            {

                memset(AUX, 0, sizeof(AUX));
                mult(SOL,C,AUX);
                memcpy(SOL,AUX,sizeof(AUX));
            }
            memset(AUX, 0, sizeof(AUX));
            mult(C,C,AUX);
            memcpy(C, AUX, sizeof(C));
        }
        g<<SOL[1][1]*x+SOL[1][2]*y+SOL[1][3]*z<<'\n';
    }
    return 0;
}