Cod sursa(job #274129)

Utilizator runnaway90Oprescu Radu Constantin runnaway90 Data 9 martie 2009 14:29:04
Problema Iepuri Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.24 kb
#include<stdio.h>
#define Q 666013

long long x,y,z,a,b,c,n,t,C[5][5],s[5][5],m[5][5];

void citire(){scanf("%lld %lld %lld %lld %lld %lld %lld",&x,&y,&z,&a,&b,&c,&n);}

void mul(long long A[5][5],long long B[5][5]){
long long  i,j,k;
     for (i=1;i<=3;i++)
         for (j=1;j<=3;j++){
             C[i][j]=0;
             for (k=1,C[i];k<=3;k++)
                 C[i][j]+=A[i][k]*B[k][j];
             }
     for (i=1;i<=3;i++)
         for (j=1;j<=3;j++)
             A[i][j]=C[i][j]%Q;
}


void init(){
         s[1][1]=1; s[1][2]=0; s[1][3]=0;
         s[2][1]=0; s[2][2]=1; s[2][3]=0;
         s[3][1]=0; s[3][2]=0; s[3][3]=1;
         m[1][1]=0; m[1][2]=0; m[1][3]=c;
         m[2][1]=1; m[2][2]=0; m[2][3]=b;
         m[3][1]=0; m[3][2]=1; m[3][3]=a;
}

int main(){
long long p,i;
    freopen("iepuri.in","r",stdin);
    freopen("iepuri.out","w",stdout);
    scanf("%lld",&t);
    for (int crt=1;crt<=t;crt++){
        citire();
        init();
        p=1;
        i=0;
        while (p<=n){
              if (p & n)
                 mul(s,m);
              i++;
              p=1<<i;
              mul(m,m);
        }
        printf("%lld\n",((s[1][1]*x)%Q+(s[2][1]*y)%Q+(s[3][1]*z)%Q)%Q);
    }
    return 0;
}