Cod sursa(job #1145264)

Utilizator TarabanDragosTaraban Dragos-Petru TarabanDragos Data 18 martie 2014 00:49:33
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.43 kb
#include<cstdio>
int t,d1,d2,d3,a,b,c,n,i,j;
long long x[5][5],y[5][5],sol[5][5];
FILE *f,*g;
void prod(long long a[5][5],long long b[5][5],long long c[5][5]){
    int i,j,k;
    for(i=0;i<=2;i++){
        for(j=0;j<=2;j++){
            c[i][j]=0;
        }
    }
    for(i=0;i<=2;i++){
        for(j=0;j<=2;j++){
            for(k=0;k<=2;k++){
                c[i][j]=(c[i][j]+(a[i][k]*b[k][j])%666013)%666013;
            }
        }
    }
}
void add(long long a[5][5],long long b[5][5]){
    int i,j;
    for(i=0;i<=2;i++){
        for(j=0;j<=2;j++){
            a[i][j]=b[i][j];
        }
    }
}
int main(){
    f=fopen("iepuri.in","r");
    g=fopen("iepuri.out","w");
    fscanf(f,"%d",&t);
    while(t!=0){
        fscanf(f,"%d%d%d%d%d%d%d",&d1,&d2,&d3,&a,&b,&c,&n);
        sol[0][0]=sol[1][1]=sol[2][2]=1;
        sol[0][1]=sol[0][2]=sol[1][0]=sol[1][2]=sol[2][0]=sol[2][1]=0;
        x[0][0]=a;
        x[0][1]=b;
        x[0][2]=c;
        x[1][0]=x[2][1]=1;
        x[1][1]=x[2][2]=x[1][2]=x[2][0]=0;
        n-=2;
        while(n!=0){
            if(n%2!=0){
                prod(x,sol,y);
                add(sol,y);
            }
            prod(x,x,y);
            add(x,y);
            n/=2;
        }
        fprintf(g,"%lld\n",((d3*sol[0][0])%666013+(d2*sol[0][1])%666013+(d1*sol[0][2])%666013)%666013);
        t--;
    }










    fclose(f);
    fclose(g);
    return 0;
}