Pagini recente » Cod sursa (job #1406805) | Cod sursa (job #3271211) | Cod sursa (job #3173867) | Cod sursa (job #1102107) | Cod sursa (job #1171047)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int ** mat_mult(int **mat1, int **mat2)
{
int **mat ;
int sum =0;
mat =(int **) malloc(9* sizeof(int));
for(int i=0; i<3; i++)
mat[i] = (int *) malloc(3* sizeof(int));
for(int i=0; i<3; i++)
for(int j=0; j<3; j++){
sum = 0;
for(int k=0; k<3; k++)
sum += (mat1[i][k] * mat2[k][j]) % 666013;
mat[i][j] = sum % 666013;
}
return mat;
}
int ** mat_pow(int **mat, long n)
{
int **mat_ret ;
mat_ret =(int **) malloc(9* sizeof(int));
for(int i=0; i<3; i++)
mat_ret[i] = (int *) malloc(3* sizeof(int));
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(int **mat)
{
for(int i=0; i<3; i++){
for(int j=0; j<3; j++)
printf("%d ", mat[i][j]);
printf("\n");
}
}
void init_mat(int **mat)
{
for(int i=0; i<3; i++)
for(int 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);
int T;
long n;
int x, y, z, A, B, C, result;
int **mat, **mat_rez ;
mat =(int **) malloc(3* sizeof(int*));
mat_rez =(int **) malloc(3* sizeof(int*));
for(int i=0; i<3; i++){
mat[i] = (int *) malloc(3* sizeof(int));
mat_rez[i] = (int *) malloc(3* sizeof(int));
}
scanf("%d", &T);
for(int i=0; i<T; i++){
scanf("%d %d %d %d %d %d %d", &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 + mat[2][1]*y + mat[2][2]*z ;
printf("%d\n", result % 666013);
}
return 0;
}