Cod sursa(job #804444)

Utilizator cdascaluDascalu Cristian cdascalu Data 29 octombrie 2012 20:02:51
Problema Iepuri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.71 kb
#include<stdio.h>
#define MOD 666013
int X,Y,Z,A,B,C,N,T;
int mat[3][3];

void i0_matrix(int a[][3])
{
    int i,j;
    for(i=0;i<3;++i)
        for(j=0;j<3;++j)
            a[i][j] = 0;
}
void i3_matrix(int a[][3])
{
    int i,j;
    for(i=0;i<3;++i)
        for(j=0;j<3;++j)
            a[i][j] = (i==j);
}
void init_mat()
{
    i0_matrix(mat);
    mat[0][0] = A;//A B C
    mat[0][1] = B;//1 0 0
    mat[0][2] = C;//0 1 0
    mat[1][0] = 1;
    mat[2][1] = 1;
}
void show_matrix(int a[][3])
{
    int i,j;
    for(i=0;i<3;++i)
    {
        for(j=0;j<3;++j)
            printf("%d ", a[i][j]);
        printf("\n");
    }
    printf("\n");
}
void copy_matrix(int a[][3], int b[][3])
{
    int i,j;
    for(i=0;i<3;++i)
        for(j=0;j<3;++j)
            a[i][j] = b[i][j];
}
void multiply_matrix(int a[][3], int b[][3])
{
    int c[3][3],i,j,k;

    i0_matrix(c);

    for(i=0;i<3;++i)
        for(j=0;j<3;++j)
            for(k=0;k<3;++k)
            {
                c[i][j] += (a[i][k] * b[k][j])%MOD;
                c[i][j] %= MOD;
            }

    copy_matrix(a,c);
}
void exp_mat(int p)
{
    int sol[3][3];
    i3_matrix(sol);
    for(;p;p/=2)
    {
        if(p%2 == 1)
        {
            multiply_matrix(sol,mat);
        }
        multiply_matrix(mat,mat);
    }
    copy_matrix(mat,sol);
}
int get_answer()
{
    return mat[0][0] * Z + mat[0][1] * Y + mat[0][2] * X;//a*z + b*y + c*x
}
int main()
{
    FILE*f = fopen("iepuri.in","r");
    FILE*g = fopen("iepuri.out","w");
    fscanf(f,"%d",&T);
    while(T--)
    {
        fscanf(f,"%d %d %d %d %d %d %d", &X, &Y, &Z, &A, &B, &C, &N);

        init_mat();
        exp_mat(N-2);
        fprintf(g,"%d\n", get_answer());
    }
    fclose(f);
    fclose(g);
    return 0;
}