Cod sursa(job #692810)

Utilizator vladtarniceruVlad Tarniceru vladtarniceru Data 26 februarie 2012 19:44:38
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.21 kb
#include <iostream>
#include <fstream>
using namespace std;

long long A,B,C,X,Y,Z,N,t;
long long mat[4][4],init[4][4];

inline void show(long long a[4][4])
{
	for(int i=1;i<=3;++i,cout<<'\n')
		for(int j=1;j<=3;++j)
			cout<<a[i][j]<<' ';
	cout<<'\n';
}

inline void matrix_mul(long long a[4][4],long long b[4][4])
{
	long long sol[4][4];
	
	for(int i=1;i<=3;++i)
	{
		for(int j=1;j<=3;++j)
		{
			sol[i][j]=0;
			for(int k=1;k<=3;++k)
			{
				sol[i][j]=sol[i][j]+1LL*a[i][k]*b[k][j];
			}
			sol[i][j]=sol[i][j]%666013;
		}
	}
	
	for(int i=1;i<=3;++i)
	{
		for(int j=1;j<=3;++j)
		{
			a[i][j]=sol[i][j];
		}
	}
}

inline void exp(long long p)
{
	for(;p>0;p>>=1)
	{
		//cout<<p<<'\n';
		if(p&1)
			matrix_mul(init,mat);
		matrix_mul(mat,mat);
		//show(mat);
	}
}

int main()
{
	ifstream in("iepuri.in");
	ofstream out("iepuri.out");
	
	for(in>>t;t>0;--t)
	{
		in>>X>>Y>>Z>>A>>B>>C>>N;
		mat[1][1]=0,mat[1][2]=0,mat[1][3]=C;
		mat[2][1]=1,mat[2][2]=0,mat[2][3]=B;
		mat[3][1]=0,mat[3][2]=1,mat[3][3]=A;
		
		init[1][1]=1,init[1][2]=0,init[1][3]=0;
		init[2][1]=0,init[2][2]=1,init[2][3]=0;
		init[3][1]=0,init[3][2]=0,init[3][3]=1;
		
		exp(N);
		out<<(init[1][1]*X+init[2][1]*Y+init[3][1]*Z)%666013<<'\n';
	}
	
	out.close();
	return 0;
}