Cod sursa(job #239251)

Utilizator horaxCont de teste horax Data 4 ianuarie 2009 14:16:40
Problema Iepuri Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.65 kb
#include <fstream>
#include <cmath>

using namespace std;

#define MOD 666013 

#define input  "iepuri.in"
#define output "iepuri.out"

ifstream fin (input);
ofstream fout(output);

long iep(long n);
long t,x,y,z,a,b,c,n,i; 

long m[4][4], m1[4][4], m2[4][4];

void mult_mat(long m[4][4], long m1[4][4], long m2[4][4]);
void copy(long m1[4][4], long m2[4][4]);
void putere( long m[4][4], long n, long m1[4][4]);
void tipar(long m[4][4]);
void putere2( long m[4][4], long n, long m1[4][4]);

int main()
{
     fin >> t;
     
     for (i = 1; i <= t; i ++ )
     {
          fin >> x >> y >> z >> a >> b >> c >> n;
          m[1][1]=m[1][3]=m[2][1]=m[2][2]=0;
          m[1][2]=m[2][3]=1;
          m[3][1]=c;
          m[3][2]=b;
          m[3][3]=a;
//          tipar(m);
          putere(m,n,m1);
          
          fout << (m1[1][1]*x+m1[1][2]*y+m1[1][3]*z) % MOD << "\n";
    }        
                                                                                                                                                               
	return 0;
}

                      

void copy(long m1[4][4], long m2[4][4])
{
    int i, j, k;
    for ( i = 1; i <= 3; i ++ )
        for ( j = 1; j <= 3; j ++ )
                 m1[i][j] = m2[i][j];   
} 
void putere( long m[4][4], long n, long m1[4][4])
{
    long m2[4][4], i;
    mult_mat(m, m, m2);
    for ( i = 3; i <= n; i ++ )
    {
        mult_mat(m, m2, m1);
        copy(m2, m1);

    }
} 

void putere2( long m[4][4], long n, long m1[4][4])
{
    long m2[4][4], i;
    if ( n == 0 )
        copy (m, m1);
    else
    {
        if ( n % 2 )
        {
            putere2(m, n/2, m2);
            mult_mat(m2,m2,m1);
            copy(m2, m1);
            mult_mat(m2, m, m1);
        }
        else
        {
            putere2(m, n/2, m2);
            mult_mat(m2,m2,m1);
        }                              
   }    
}
                                                                  
void mult_mat(long m1[4][4], long m2[4][4], long m3[4][4])
{
    int i, j, k;
    for ( i = 1; i <= 3; i ++ )
        for ( j = 1; j <= 3; j ++ )
        {
            m3[i][j] = 0;
            for ( k = 1; k <= 3; k ++ )
                        m3[i][j] += m1[i][k]*m2[k][j] % MOD;
        }                                                                                                  
}
   
    
void tipar(long m[4][4])        
{
    int i, j, k;
    fout << "\n";
    for ( i = 1; i <= 3; i ++ )
    {
        fout << "\n";
        for ( j = 1; j <= 3; j ++ )

                fout << m[i][j] << " ";
    }
}