Cod sursa(job #1405500)

Utilizator AndreeaNNedelcu Andreea AndreeaN Data 29 martie 2015 12:18:56
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.84 kb
#include <stdio.h>
#define MOD 666013
FILE *f=fopen("iepuri.in","r"),*g=fopen("iepuri.out","w");
long long t,X,Y,Z,A,B,C,n,a[4][4],r[4][4];

void initializare(long long q[4][4]){
    q[1][1]=A; a[1][2]=B; q[1][3]=C;
    q[2][1]=1; q[2][2]=0; q[2][3]=0;
    q[3][1]=0; q[3][2]=1; q[3][3]=0;
}
void initializare_r(long long q[4][4]){
    q[1][1]=1; a[1][2]=0; q[1][3]=0;
    q[2][1]=0; q[2][2]=1; q[2][3]=0;
    q[3][1]=0; q[3][2]=0; q[3][3]=1;
}
void produs(long long d[4][4],long long e[4][4],long long f[4][4]){
long long i,j,k;
    for(i=1; i<=3; i++){
        for(j=1; j<=3; j++){
            f[i][j]=0;
            for(k=1; k<=3; k++){
                f[i][j]+=(d[i][k]*e[k][j]) % MOD;
                f[i][j]=f[i][j]%MOD;
            }
        }
    }
}
void init1(long long q[4][4]){
    for(long long i=1;i<=3; i++){
        for(long long j=1; j<=3; j++){
            q[i][j]=0;
        }
    }
}
void copiere(long long d[4][4],long long e[4][4]){
long long i,j;
    for(i=1; i<=3; i++){
        for(j=1; j<=3; j++){
            d[i][j]=e[i][j];
        }
    }
}
void rezolvare(long long b){
long long i,j,x[4][4];
    init1(x);
    init1(r);
    for(i=1;i<=3;i++)
        r[i][i] = 1;
    while(b!=0){
        if(b%2==1){
            init1(x);
            produs(r,a,x);
            copiere(r,x);
        }
        init1(x);
        produs(a,a,x);
        copiere(a,x);
        b=b/2;
    }
}

void citire(){
long long i,s=0;
    fscanf(f,"%lld\n",&t);
    for(i=1; i<=t; i++){
        fscanf(f,"%lld %lld %lld %lld %lld %lld %lld\n",&X,&Y,&Z,&A,&B,&C,&n);
        initializare(a);
       // initializare_r(r);
        rezolvare(n-2);
        s=0;
        s=r[1][1]*Z+r[1][2]*Y+r[1][3]*X;
        s=s%MOD;
        fprintf(g,"%lld\n",s);

    }
}

int main()
{
    citire();
    return 0;
}