Cod sursa(job #292)

Utilizator adyshorcont de teste adyshor Data 8 decembrie 2006 17:29:59
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.06 kb
#include<stdio.h>
#include<math.h>
#include<stdio.h>
#include<stdlib.h>
#define R 666013
long long M[10][10] , MM[10][10] , MMM[10][10] , sol[10][10] ,sol1[10][10];
long  long n , x , y, z ,a,b,c,i,j,aux , q , t ,sir[101],kkt; 
FILE *fin,*fout;

int main()
{
    fin = fopen("iepuri.in","r");
    fout = fopen("iepuri.out","w");
    fscanf(fin,"%ld",&t);
    for (long k = 1 ; k<= t ; k++)
    {
    fscanf(fin,"%ld%ld%ld%ld%ld%ld%ld",&x,&y,&z,&a,&b,&c,&n);
    M[1][2] =1;
    M[2][3] =1;
    M[3][1] =c;
    M[3][2] =b;
    M[3][3] =a;
    MM[1][2] =1;
    MM[2][3] =1;
    MM[3][1] =c;
    MM[3][2] =b;
    MM[3][3] =a;
    sol[1][1] = 1 , sol[2][2] = 1, sol[3][3] = 1;
    
    aux = n;
    while (aux)
    {
          sir[0]++;
          sir[sir[0]] = aux%2;
          aux/=2;
    }
    if (sir[1]==1)
    {
    long s;
    for (j = 1 ; j<= 3 ; j++)
    {

                s = M[j][1]*sol[1][1] + M[j][2]*sol[2][1] + M[j][3]*sol[3][1]; 
                sol1[j][1] = s%R;
      
                s = M[j][1]*sol[1][2] + M[j][2]*sol[2][2] + M[j][3]*sol[3][2];
                sol1[j][2] = s%R;
      
                s = M[j][1]*sol[1][3] + M[j][2]*sol[2][3] + M[j][3]*sol[3][3];
                sol1[j][3] = s%R;
        
    }
    
    for (j = 1 ; j<= 3 ; j++)
    {
            for (q = 1 ; q<= 3 ; q++)
                sol[j][q] = sol1[j][q];
    }
    }
    for (i = 1 ; i < sir[0]  ; i++)
    {
        long s = 0 ;
        for (j = 1 ; j<= 3 ; j++)
        {
   
            {
                s = MM[j][1]*M[1][1]%R + MM[j][2]*M[2][1]%R + MM[j][3]*M[3][1]%R; 
                MMM[j][1] = s%R;
 
                s = MM[j][1]*M[1][2]%R + MM[j][2]*M[2][2]%R + MM[j][3]*M[3][2]%R;
                MMM[j][2] = s%R;

                s = MM[j][1]*M[1][3]%R + MM[j][2]*M[2][3]%R + MM[j][3]*M[3][3]%R;
                MMM[j][3] = s%R;
       
            }
        }
        for (j = 1 ; j<= 3 ; j++)
        {
            for (q = 1 ; q<= 3 ; q++)
                MM[j][q] = MMM[j][q] , M[j][q] = MMM[j][q];
        }
        if (sir[i+1]==1)
        {
                for (j = 1 ; j<= 3 ; j++)
                {

                {
                s = M[j][1]*sol[1][1]%R + M[j][2]*sol[2][1]%R + M[j][3]*sol[3][1]%R; 
                sol1[j][1] = s%R;
      
                s = M[j][1]*sol[1][2]%R + M[j][2]*sol[2][2]%R + M[j][3]*sol[3][2]%R;
                sol1[j][2] = s%R;
      
                s = M[j][1]*sol[1][3]%R + M[j][2]*sol[2][3]%R + M[j][3]*sol[3][3]%R;
                sol1[j][3] = s%R;
        
            }
        }
        for (j = 1 ; j<= 3 ; j++)
        {
            for (q = 1 ; q<= 3 ; q++)
                sol[j][q] = sol1[j][q];
        }
        }           
    }
    fprintf(fout,"%lld\n",(sol[1][1]*x+sol[1][2]*y+sol[1][3]*z)%R);    
    
    for (q = 1 ; q<= 3 ; q++)
        for (j = 1 ; j<= 3 ; j++)
            MMM[q][j] = 0 , MM[q][j] = 0 , sol[q][j] = 0 , sol1[q][j] = 0 , M[q][j] = 0;
    for (q = 1 ; q<= sir[0] ; q++)
        sir[q] = 0;
    sir[0] = 0;
    }
    return 0;
}