Cod sursa(job #377085)

Utilizator Alexa_ioana_14Antoche Ioana Alexandra Alexa_ioana_14 Data 23 decembrie 2009 13:46:55
Problema Iepuri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.54 kb
#include<cstdio>
#define N 4
#define MOD 666013
int a[N],copie[32][N][N],m[N][N],p,rez[N][N];
void copiez(int x)
{
	for (int i=1; i<=3; ++i)
		for (int j=1; j<=3; ++j)
			copie[x][i][j]=m[i][j];

}
void m2()
{
	for (int i=1; i<=3; ++i)
            for (int j=1; j<=3; ++j)
	    {
	    	rez[i][j]=0;
		for (int k=1; k<=3; ++k)
                     rez[i][j]=(rez[i][j]+(m[i][k]*m[k][j])%MOD)%MOD;
	    }
	for (int i=1; i<=3; ++i)
		for (int j=1; j<=3; ++j)
		     m[i][j]=rez[i][j];   
}
void copieXm(int x)
{
    for (int i=1; i<=3; ++i)
	    for (int j=1; j<=3; ++j)
	    {
		    rez[i][j]=0;
		    for (int k=1; k<=3; ++k)
			    rez[i][j]=(rez[i][j]+(copie[x][i][k]*m[k][j])%MOD)%MOD;
	    }
   for (int i=1; i<=3; ++i)
	   for (int j=1; j<=3; ++j)
		   m[i][j]=rez[i][j];
}
void putere(int p,int num)
{
	if (!p)
	{
		for (int i=1; i<=3;++i) 
			for(int j=1; j<=3; ++j)
				if (i==j)
					m[i][j]=1;
				else
					m[i][j]=0;
		return;
	}
	if (p&1)
	{
		copiez(num);
		m2();
		putere(p>>1,num+1);
        copieXm(num);
	}
	else
	{
		m2();
		putere(p>>1,num);
	}
}
void mXa()
{
	for (int i=1; i<=3; ++i)
	{
		rez[i][1]=0;
		for (int k=1; k<=3; ++k)
			rez[i][1]=(rez[i][1]+(m[i][k]*a[k])%MOD)%MOD;
	}
}
void citire()
{
	freopen("iepuri.in","r",stdin);
	freopen("iepuri.out","w",stdout);
	short int t;
	scanf("%hd",&t);
	while (t--)
	{
		scanf("%d%d%d%d%d%d%d",&a[1],&a[2],&a[3],&m[3][3],&m[3][2],&m[3][1],&p);
		m[2][1]=0;m[2][2]=0;m[2][3]=1;
		m[1][1]=0;m[1][2]=1;m[1][3]=0;
		putere(p,0);
		mXa();
		printf("%d\n",rez[1][1]);
	}
}
int main()
{
	citire();
	return 0;
}