Cod sursa(job #445004)

Utilizator irene_mFMI Irina Iancu irene_m Data 22 aprilie 2010 14:18:45
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.5 kb
#include <cstdio>
#define infile "iepuri.in"
#define outfile "iepuri.out"
#define MOD 666013
#define ll long long

ll M[4][4]; //matrice ridicata la ^N
ll N,sol;
ll A,B,C;
ll x,y,z;
int T;

void initial()
{
      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;
}

void transf(ll M[4][4],ll X[4][4])
{
      int i,j;
      for(i=1;i<=3;i++)
            for(j=1;j<=3;j++)
                  X[i][j]=M[i][j];
}

void pow(ll M[4][4],ll P)
{
      ll X[4][4],Y[4][4],Z[4][4];
      int i,j,k;
      if(P==1)
            return;
      else
            if(P%2==0)
            {
                  transf(M,X);
                  pow(X,P/2);

                  for(i=1;i<=3;i++)
                        for(j=1;j<=3;j++)
                        {
                              M[i][j]=0;
                              for(k=1;k<=3;k++)
                              {
                                    M[i][j]+=(X[i][k]*X[k][j])%MOD;
                                    M[i][j]%=MOD;
                              }
                        }
                  i=3;
            }
            else
            {
                  transf(M,X); transf(M,Y);
                  pow(X,(P-1)/2);

                  for(i=1;i<=3;i++)
                        for(j=1;j<=3;j++)
                        {
                              Z[i][j]=0;
                              for(k=1;k<=3;k++)
                              {
                                    Z[i][j]+=(X[i][k]*X[k][j])%MOD;
                                    Z[i][j]%=MOD;
                              }
                        }

                  for(i=1;i<=3;i++)
                        for(j=1;j<=3;j++)
                        {
                              M[i][j]=0;
                              for(k=1;k<=3;k++)
                              {
                                    M[i][j]+=(Z[i][k]*Y[k][j])%MOD;
                                    M[i][j]%=MOD;
                              }
                        }
                  i=3;
            }
}

void solve()
{
      initial();
      pow(M,N);
      sol=(M[1][1]*x)%MOD + (M[1][2]*y)%MOD + (M[1][3]*z)%MOD;
      sol%=MOD;
}

int main()
{
	freopen(infile,"r",stdin);
	freopen(outfile,"w",stdout);

	scanf("%d",&T);
	for(;T;T--)
	{
		scanf("%lld%lld%lld%lld%lld%lld%lld",&x,&y,&z,&A,&B,&C,&N);
		solve();
		printf("%lld\n",sol);
	}

	fclose(stdin);
	fclose(stdout);
	return 0;
}