Cod sursa(job #144819)

Utilizator DorinOltean Dorin Dorin Data 27 februarie 2008 23:35:08
Problema Iepuri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.91 kb
# include <stdio.h>
# include <cstring>

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

# define max 666014
# define div 666013

long long i, j, k, n, x, y, z, a, b, c, aux, T;
long long v[3][3];
long long t[3][3];

void afis(long long a[3][3])
{
     for(i=0;i<3;i++)
     {
        for(j=0;j<3;j++)        
            printf("%ld ",a[i][j]);
        printf("\n");
     }
      printf("\n");
}

void inmulteste(long long p[3][3],long long f1[3][3],long long f2[3][3])
{
    int i,j,k;
    for(i=0;i<3;i++)
        for(j=0;j<3;j++)
        {
            p[i][j] = 0;
            for(k=0;k<3;k++)
            {
                p[i][j] += (f1[i][k] * f2[k][j]);
                p[i][j] %= div;
            }
        }
}

void prod(long long n)
{
    while(n)
    {
       long long r[3][3];
       if(n%2)
       {
          inmulteste(r,t,v); 
          memcpy(t,r,sizeof(t));
       }
       inmulteste(r,v,v);
       memcpy(v,r,sizeof(v));
       afis(v);
       n>>=1;
    }
}

int main()
{
    freopen(input, "r", stdin);
    freopen( output, "w", stdout);
    scanf("%lld",&T);
    
    while(T--)
    {        
        scanf("%lld%lld%lld%lld%lld%lld%lld",&x,&y,&z,&a,&b,&c,&n);
        /*
        for(i=3;i<=n;i++)
        {
            long long aux;
            aux = (x*c+y*b+z*a)%div;
            x = y;
            y = z;
            z = aux;
        }
        printf("%lld\n",z);
        */
        v[0][0] = a; v[0][1] = b; v[0][2] = c;
        v[1][0] = 1; v[1][1] = 0; v[1][2] = 0;
        v[2][0] = 0; v[2][1] = 1; v[2][2] = 0;
        
        t[0][0] = 1; t[0][1] = 0; t[0][2] = 0;
        t[1][0] = 0; t[1][1] = 1; t[1][2] = 0;
        t[2][0] = 0; t[2][1] = 0; t[2][2] = 1;
        

        prod(n-2);
        long long res = (t[0][0] * z + t[0][1] * y + t[0][2] * x)%div;

        printf("%lld\n",res);
    }
    
    return 0;    
}