Cod sursa(job #164995)

Utilizator mordredSimionescu Andrei mordred Data 25 martie 2008 01:42:33
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.62 kb
#include<cstdlib>
#include<string>
long long a1[4][4],a2[4][4],a3[4][4];
int t, x, y, z, a, b, c, n, i, j;

void mlt(long long a[4][4], long long b[4][4]);
void pw(int x);

int main(){
freopen("iepuri.in","r",stdin);
freopen("iepuri.out","w",stdout);

for(scanf("%d\n",&t);t;t--){
scanf("%d %d %d %d %d %d %d\n", &x, &y, &z, &a, &b, &c, &n);      
     
        a1[1][1] = 0, a1[1][2] = 0, a1[1][3] = c;      
        a1[2][1] = 1, a1[2][2] = 0, a1[2][3] = b;      
        a1[3][1] = 0, a1[3][2] = 1, a1[3][3] = a;      
     
        a3[1][1] = 1, a3[1][2] = 0, a3[1][3] = 0;      
        a3[2][1] = 0, a3[2][2] = 1, a3[2][3] = 0;    
        a3[3][1] = 0, a3[3][2] = 0, a3[3][3] = 1;
        
        for (i = 1; i <= 3; i ++) {      
            for (j = 1; j <= 3; j ++) {      
                a2[i][j] = a1[i][j];      
            }
        }
         pw(n - 2);      
     
        printf("%lld\n", (((long long)x*a3[1][3])%666013+((long long)y*a3[2][3]%666013)+((long long)z*a3[3][3])%666013)%666013);           
}

return 0;
}

void mlt(long long a[4][4], long long b[4][4]){
int i,j,k,c[4][4];
for (i = 1; i <= 3; i ++) {      
    for (j = 1; j <= 3; j ++) c[i][j] = 0;      
    for (j = 1; j <= 3; j ++) {      
        for (k = 1; k <= 3; k ++) {      
            c[i][k] += ((long long) (a[i][j] * b[j][k])) % 666013;      
        }      
    }      
}
for (i = 1; i <= 3; i ++) {      
    for (j = 1; j <= 3; j ++) 
        a[i][j] = c[i][j];
    }
}

void pw(int x){
for (; x; x >>= 1) {      
    if (x & 1) mlt(a3, a2);      
        mlt(a2, a2);      
    }          
}