Cod sursa(job #377291)

Utilizator perticas_catalinperticas catalin perticas_catalin Data 23 decembrie 2009 22:04:21
Problema Iepuri Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.29 kb
#include<iostream>
#include<string>

using namespace std;

#define LL long long
#define MOD 666013
#define FOR(i,a,b) for(int i=(a);i<=(b);++i)

int X,Y,Z,A,B,C,N;

inline void prod(int A[3][3],int B[3][3])
{
     int C[3][3]; 
     
     memset(C,0,sizeof(C));
     
     FOR(i,0,2)
       FOR(j,0,2)
         FOR(k,0,2) 
           C[i][j]=((LL)C[i][j]+(LL)A[i][k]*B[k][j])%MOD;
         
     memcpy(A,C,sizeof(C));    
}

int main()
{
    int T,ans[3][3],M[3][3],x,y,z;
    
    freopen("iepuri.in","r",stdin);
    freopen("iepuri.out","w",stdout);
    
    scanf("%d",&T);
    
    while(T--)
    {
        scanf("%d %d %d %d %d %d %d\n",&X,&Y,&Z,&A,&B,&C,&N);
     
        memset(ans,0,sizeof(ans));
      
        ans[0][0]=1;
        ans[1][1]=1;
        ans[2][2]=1;
      
        memset(M,0,sizeof(M));
       
        M[0][0]=A;
        M[0][1]=B;
        M[0][2]=C;
        M[1][0]=1;
        M[2][1]=1;
      
        int nr=1;
      
        FOR(i,0,29)
        {
          if(nr>N-2) break;
        
          if((N-2)&(1<<i)) prod(ans,M);
          prod(M,M);
          nr*=2;
        }
        
        int ansc=((LL)ans[0][0]*Z+(LL)ans[0][1]*Y+(LL)ans[0][2]*X)%MOD;
      
        printf("%d\n",ansc);
    }
    
    return 0;
}