Cod sursa(job #394865)

Utilizator perticas_catalinperticas catalin perticas_catalin Data 11 februarie 2010 18:49:59
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.49 kb
#include<iostream>
#include<string>

using namespace std;

#define NM 5
#define MOD 666013
#define D 3
#define LL long long

void multiply(int A[NM][NM],int B[NM][NM],int C[NM][NM])
{
    int ans[NM][NM];   
       
    for(int i=1;i<=D;++i)
       for(int j=1;j<=D;++j)
       {
          ans[i][j]=0; 
          for(int k=1;k<=D;++k)   
          {
             ans[i][j]+=((LL)A[i][k]*B[k][j])%MOD;
             if(ans[i][j]>=MOD) ans[i][j]-=MOD;
          }   
       }   
    
    for(int i=1;i<=D;++i)
       for(int j=1;j<=D;++j)
          C[i][j]=ans[i][j];       
             
}

int main()
{
    int M[NM][NM],R[NM][NM],T,A,B,C,X,Y,Z,N;
    
    freopen("iepuri.in","r",stdin);
    freopen("iepuri.out","w",stdout);
    
    scanf("%d",&T);
    
    while(T--)
    {
        scanf("%d %d %d %d %d %d %d",&X,&Y,&Z,&A,&B,&C,&N);  
        
        memset(R,0,sizeof(R));
        
        for(int i=1;i<=D;++i)
           R[i][i]=1;
        
        memset(M,0,sizeof(M));
        
        M[1][2]=1;
        M[2][3]=1;
        M[3][1]=C;
        M[3][2]=B;
        M[3][3]=A;
        
        for(int i=0;i<=30 && N;++i)        
        {
           if((1<<i)&N)
           {
              multiply(M,R,R);
              N-=(1<<i);
           }     
           
           multiply(M,M,M);
        }
        
        
        LL ans=((LL)X*R[1][1] + (LL)Y*R[1][2] + (LL)Z*R[1][3])%MOD;
        printf("%I64d\n",ans);
    }
    
    return 0;
}