Cod sursa(job #88770)

Utilizator blasterzMircea Dima blasterz Data 3 octombrie 2007 21:17:42
Problema Iepuri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.54 kb
// (c) Mircea Dima
#include <cstdio>
#include <string>
#define LG 31
#define ul long long
ul a[LG+3][4][4];
int X, Y, Z, A, B, C, N;

void inmultire(ul a[4][4], ul a1[4][4], ul a2[4][4])
{
	ul c[4][4], i, j, k;
	memset(c, 0, sizeof(c));
	
	int ok=0;
	for(i=1;i<=3;++i)
		for(j=1;j<=3;++j) if(a1[i][j]!=0) ok=1;
	
	if(!ok) 
	{
		for(i=1;i<=3;++i)
			for(j=1;j<=3;++j) a[i][j]=a2[i][j];
		return;
	}
	
	for(i=1;i<=3;++i)
		for(j=1;j<=3;++j)
			for(k=1;k<=3;++k) 
				c[i][j]+=a1[i][k]*a2[k][j];
	
	
		/*	
	for(i=1;i<=3;++i)
	{
		for(j=1;j<=3;++j) printf("%d ", c[i][j]);
		printf("\n");
	}
	printf("__\n");
		*/
	for(i=1;i<=3;++i)
		for(j=1;j<=3;++j) a[i][j]=c[i][j];
}

void solve()
{
	int i, cnt,stp;
	ul sol[4][4];
	memset(sol, 0, sizeof(sol));
	memset(a, 0, sizeof(a));
	
	a[1][1][2]=1;
	a[1][2][3]=1;
	a[1][3][1]=C;
	a[1][3][2]=B;
	a[1][3][3]=A;
	
	for(cnt=2, stp=2; cnt<=N ; cnt<<=1, ++stp)
		inmultire(a[stp], a[stp-1], a[stp-1]);
	
	
	
	for(cnt=1, stp=1; cnt<=N ; cnt<<=1, ++stp)
		if(cnt&N){ inmultire(sol, sol, a[stp]);}
	/*
	for(int i=1;i<=3;++i)
	{
		for(int j=1;j<=3;++j)printf("%d ", sol[i][j]);
		printf("\n");
	}
	printf("\n");
	*/
	ul sum=0;
	sum+=sol[1][1]*X;
	sum+=sol[1][2]*Y;
	sum+=sol[1][3]*Z;
	printf("%lld\n", sum);
	
}

void read()
{
	int T;
	freopen("iepuri.in","r",stdin);
	scanf("%d", &T);
	while(T--)
	{
		scanf("%d %d %d %d %d %d %d\n",&X, &Y, &Z, &A, &B, &C, &N);
		solve();
		
	}
}

int main()
{
	freopen("iepuri.out","w",stdout);
	read();
	return 0;
}