Cod sursa(job #1249992)

Utilizator alexpetrescuAlexandru Petrescu alexpetrescu Data 27 octombrie 2014 18:45:29
Problema Iepuri Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 1.4 kb
#include <stdio.h>
#define MOD 666013
int m[3][3], p[3][3];
inline void initializareM(){
    int i, j;
    for(i=0; i<3; i++){
        for(j=0; j<i; j++){
            m[i][j]=0;
        }
        m[i][i]=1;
        for(j=i+1; j<3; j++){
            m[i][j]=0;
        }
    }
}
inline void initializareP(){
    p[0][0]=p[0][1]=p[1][1]=p[2][0]=0;
    p[1][0]=p[2][1]=1;
}
inline void inmultire(int a[3][3], int b[3][3]){
    int i, j, k, aux[3][3];
    for(i=0; i<3; i++){
        for(j=0; j<3; j++){
            aux[i][j]=0;
            for(k=0; k<3; k++){
                aux[i][j]=(1LL*aux[i][j]+1LL*a[i][k]*b[k][j])%MOD;
            }
        }
    }
    for(i=0; i<3; i++){
        for(j=0; j<3; j++){
            a[i][j]=aux[i][j];
        }
    }
}
inline void lgput(int n){
    initializareM();
    initializareP();
    while(n!=0){
        if((n&1)==1){
            inmultire(m, p);
        }
        inmultire(p, p);
        n>>=1;
    }
}
int main(){
    int x, y, z, n, T, t;
    FILE *fin, *fout;
    fin=fopen("iepuri.in", "r");
    fout=fopen("iepuri.out", "w");
    fscanf(fin, "%d", &T);
    for(t=0; t<T; t++){
        fscanf(fin, "%d%d%d%d%d%d%d", &x, &y, &z, &p[2][2], &p[1][2], &p[0][2], &n);
        lgput(n-2);
        fprintf(fout, "%lld\n", (1LL*m[0][2]*x+1LL*m[1][2]*y+1LL*m[2][2]*z)%MOD);
    }
    fclose(fin);
    fclose(fout);
    return 0;
}