Cod sursa(job #1135506)

Utilizator Claudiu95Vartolomei Alexandru Claudiu Claudiu95 Data 7 martie 2014 22:27:14
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.12 kb

#include<fstream>
#define rest 666013
using namespace std;
ifstream f("iepuri.in");
ofstream g("iepuri.out");
long long int M[5][5],n,IN[5][5],C[5][5];
unsigned int t,x,y,z,a,b,c;
void inmultire(long long int a[5][5],long long int b[5][5]){
	long long int s;
	for(int i=1;i<=3;++i)
		for(int j=1;j<=3;++j){
			s=0;
			for(int k=1;k<=3;++k){
				s+=((a[i][k]*b[k][j])%rest)%rest;
				
			}
			C[i][j]=s%rest;
		}
	for(int i=1;i<=3;++i)
		for(int j=1;j<=3;++j)
			a[i][j]=C[i][j];
}
void putere(int n){
	long long int aux[5][5];
	for(int i=1;i<=3;++i){
		
		for(int j=1;j<=3;++j){
			IN[i][j]=0;
			aux[i][j]=M[i][j];
		}
	}
	IN[1][1]=IN[2][2]=IN[3][3]=1;
	for(;n;n>>=1){
		if(n & 1)
			inmultire(IN,aux);
		inmultire(aux,aux);
	}
	
	M[1][1]=IN[1][1];
	M[1][2]=IN[1][2];
	M[1][3]=IN[1][3];
	
}
int main(){
	f>>t;
	for(int i=1;i<=t;++i){
		f>>x>>y>>z>>a>>b>>c>>n;
		M[1][1]=a;
		M[1][2]=b;
		M[1][3]=c;
		M[2][1]=M[3][2]=1;
		M[2][2]=M[2][3]=M[3][1]=M[3][3]=0;
		putere(n-2);
		long long int s= ((M[1][1]*z)%rest +(M[1][2]*y)%rest + (M[1][3]*x)%rest)%rest;
		g<<s<<"\n";
	}
	return 0;
}