Cod sursa(job #690013)

Utilizator an_drey_curentandreycurent an_drey_curent Data 25 februarie 2012 02:11:28
Problema Iepuri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.1 kb
#include<stdio.h>
int SOL[4][4],MAT[4][4],T;
void deschidere()
{
	freopen("iepuri.in","r",stdin);
	freopen("iepuri.out","w",stdout);
}
void inmultirematrice(int A[][4],int B[][4],int C[][4])
{
	int i,j,k;
	for(i=1;i<=3;i++)
		for(j=1;j<=3;j++)
		{
			A[i][j]=0;
			for(k=1;k<=3;k++)
				A[i][j]+=(B[i][k]*C[k][j]);
		}
}
void atribuire(int A[][4],int B[][4])
{
	int i,j;
	for(i=1;i<=3;i++)
		for(j=1;j<=3;j++)
			A[i][j]=B[i][j];
}
void explog(int P)
{
	int AUX[4][4];
	if(P!=1)
		if(P%2)
		{explog(P-1);inmultirematrice(AUX,SOL,MAT);atribuire(SOL,AUX);}
		else
		{explog(P/2);inmultirematrice(AUX,SOL,SOL);atribuire(SOL,AUX);}
}
void citire()
{
	int X,Y,Z,A,B,C,N,i,j;
	scanf("%d",&T);
	while(T--)
	{
		scanf("%d%d%d%d%d%d%d",&X,&Y,&Z,&A,&B,&C,&N);
		MAT[1][1]=A;MAT[1][2]=B;MAT[1][3]=C;
		MAT[2][1]=1;MAT[2][2]=0;MAT[2][3]=0;
		MAT[3][1]=0;MAT[3][2]=1;MAT[3][3]=0;
		for(i=1;i<=3;i++)
			for(j=1;j<=3;j++)
				SOL[i][j]=MAT[i][j];
		explog(N-2);
		printf("%d\n",(Z*SOL[1][1]) + (Y*SOL[1][2]) + (X*SOL[1][3]) );
	}
}
int main()
{
	deschidere();
	citire();
	return 0;
}