Cod sursa(job #1171061)

Utilizator stefynr8Space Monkey stefynr8 Data 15 aprilie 2014 00:47:21
Problema Iepuri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.98 kb
#include <stdio.h>
#include <stdlib.h>
#include <string.h>


long ** mat_mult(long **mat1, long **mat2)
{
	long **mat ;
	long sum =0;

	mat =(long **) malloc(9* sizeof(long));
	for(long i=0; i<3; i++)
		mat[i] = (long *) malloc(3* sizeof(long));

	for(long i=0; i<3; i++)
		for(long j=0; j<3; j++){
			sum = 0;
			for(long k=0; k<3; k++)
				sum = (sum + mat1[i][k] * mat2[k][j]) % 666013;

			mat[i][j] = sum;
		}

	return mat;
}

long ** mat_pow(long **mat, long n)
{
	long **mat_ret ;
	mat_ret =(long **) malloc(9* sizeof(long));
	for(long i=0; i<3; i++)
		mat_ret[i] = (long *) malloc(3* sizeof(long));

	if (n==1) return mat;
	
	if (n%2 == 0){
		mat_ret = mat_pow(mat, n/2);
		mat_ret = mat_mult(mat_ret, mat_ret);
	}
	else{
		mat_ret = mat_pow(mat, (n-1)/2);
		mat_ret = mat_mult(mat_ret, mat_ret);
		mat_ret = mat_mult(mat_ret, mat);
	}

	return mat_ret;
}

void print_mat(long **mat)
{
	for(long i=0; i<3; i++){
		for(long j=0; j<3; j++)
			printf("%ld ", mat[i][j]);
		printf("\n");
	}
}

void init_mat(long **mat)
{
	for(long i=0; i<3; i++)
		for(long j=0; j<3; j++)
			mat[i][j]=0;

	mat[0][1] = 1;
	mat[1][2] = 1;
}

int main()
{
	freopen("iepuri.in", "r", stdin);
	freopen("iepuri.out", "w", stdout);

	long T;
	long n;
	long x, y, z, A, B, C, result;
	long **mat, **mat_rez ;

	mat =(long **) malloc(3* sizeof(long*));
	mat_rez =(long **) malloc(3* sizeof(long*));
	for(long i=0; i<3; i++){
		mat[i] = (long *) malloc(3* sizeof(long));
		mat_rez[i] = (long *) malloc(3* sizeof(long));
	}

	scanf("%ld", &T);

	for(long i=0; i<T; i++){
		scanf("%ld %ld %ld %ld %ld %ld %ld", &x, &y, &z, &A, &B, &C, &n);
		
		init_mat(mat);
		
		mat[2][0] = C;
		mat[2][1] = B;
		mat[2][2] = A;

		//print_mat(mat);
		//printf("\n----\n\n");
		
		mat = mat_pow(mat, n-2);
		//print_mat(mat);

		result = mat[2][0]*x % 666013 + mat[2][1]*y % 666013 + mat[2][2]*z % 666013 ;
		printf("%ld\n", result % 666013);
	}


	return 0;
}