Cod sursa(job #1405447)

Utilizator rughibemBelcineanu Alexandru Ioan rughibem Data 29 martie 2015 11:32:21
Problema Iepuri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.44 kb
#include<stdio.h>
#define MOD 666013
FILE *f=fopen("iepuri.in","r"), *g=fopen("iepuri.out","w");

long long T, t, X, Y, Z, A, B, C, N;

void Init( long long Q[4][4] ){

    for(int i=1;i<=3;i++)
        for(int j=1;j<=3;j++)
            Q[i][j] = 0;
}

void Inmult( long long a[4][4], long long b[4][4], long long c[4][4] ){
int i, j, k;

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

void Copiere( long long a[4][4], long long b[4][4] ){

    for(int i=1;i<=3;i++)
        for(int j=1;j<=3;j++)
            a[i][j] = b[i][j];

}

void Rezolva(){
long long i, j, R[4][4], x[4][4], a[4][4], b;

    Init(R);
    for(i=1;i<=3;i++)
        R[i][i] = 1;

    a[1][1] = A; a[1][2] = B; a[1][3] = C;
    a[2][1] = 1; a[2][2] = 0; a[2][3] = 0;
    a[3][1] = 0; a[3][2] = 1; a[3][3] = 0;

    b = N - 2;

    while( b != 0 ){

        if( b % 2 == 1 ){
            Init(x);
            Inmult(R,a,x);
            Copiere(R,x);
        }
        Init(x);
        Inmult(a,a,x);
        Copiere(a,x);

        b /= 2;

    }
    fprintf(g,"%lld\n", R[1][1] * Z + R[1][2] * Y + R[1][3] * X );

}

int main(){

    fscanf(f,"%lld\n",&T);
    for(t=1;t<=T;t++){
        fscanf(f,"%lld %lld %lld %lld %lld %lld %lld\n",&X,&Y,&Z,&A,&B,&C,&N);
        Rezolva();
    }

return 0;
}