Cod sursa(job #1298404)

Utilizator Bogdan.GhGheorghe Bogdan Bogdan.Gh Data 22 decembrie 2014 20:02:21
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.29 kb
#include<iostream>
#include<fstream>
using namespace std;

long long C[3][3],A[3][3],B[3][3],v[3],D[3][3],E[3][3],S,n;

void inmultire(long long X[3][3], long long Y[3][3])
{
	int i,j,nr=0;
	for(i=0;i<3;i++)
	{
		for(j=0;j<3;j++)
		{
			B[i][j]=X[i][j];
			E[i][j]=Y[i][j];
		}
	}
	for(i=0;i<3;i++)
	{
		C[i][0]=(B[i][0] * E[0][nr] + B[i][1] * E[1][nr] + B[i][2] * E[2][nr])%666013;
		C[i][1]=(B[i][0] * E[0][nr+1] + B[i][1] * E[1][nr+1] + B[i][2] * E[2][nr+1])%666013;
		C[i][2]=(B[i][0] * E[0][nr+2] + B[i][1] * E[1][nr+2] + B[i][2] * E[2][nr+2])%666013;
		
	}
}

void pow(long long Z[3][3],int n)
{
	int i,j;
	if(n==0)
	{
		for(i=0;i<3;i++)
		{
			for(j=0;j<3;j++)
			{
				if(i==j)
					C[i][i]=1;
				else
					C[i][j]=0;
			}
		}
		return;
	}
	if(n%2==0)
	{
		pow(C,n/2);
		inmultire(C,C);
		return;
	}
	else
	{
		pow(C,n-1);
		inmultire(C,D);
		return;
	}
}

int main()
{
	int i,T,j;
	ifstream f("iepuri.in");
	ofstream g("iepuri.out");
	f>>T;
	for(int k=1;k<=T;k++)
	{
		f>>v[0]>>v[1]>>v[2];
		f>>A[0][0]>>A[0][1]>>A[0][2];
		A[1][0]=1;
		A[2][1]=1;
		f>>n;
		for(i=0;i<3;i++)
		{
			for(j=0;j<3;j++)
				D[i][j]=A[i][j];
		}
		pow(A,n-2);
		S=(C[0][0]*v[2]+C[0][1]*v[1]+C[0][2]*v[0])%666013;
		g<<S<<endl;
	}
	g.close();
	return 0;
}