Cod sursa(job #762206)

Utilizator geniucosOncescu Costin geniucos Data 29 iunie 2012 12:42:01
Problema Iepuri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.16 kb
#include<cstdio>
using namespace std;
int a0,a1,a2,i1,t1,n1,n,x,y,z,A,B,C;
struct str
{
	int a[5][5];
};
str rez,mat;
str pow(str x,int c)
{
	int i,j,k;
	str rez,mat;
	long long s;
	if(c==1) return x;
	if(c%2==0)
	{
		mat=pow(x,c/2);
		for(i=1;i<=3;i++)
			for(j=1;j<=3;j++)
			{
				s=0;
				for(k=1;k<=3;k++)
					s=s+mat.a[i][k]*mat.a[k][j];
				rez.a[i][j]=s%666013;
			}
		return rez;
	}
	else
	{
		mat=pow(x,c-1);
		mat=pow(x,c/2);
		for(i=1;i<=3;i++)
			for(j=1;j<=3;j++)
			{
				s=0;
				for(k=1;k<=3;k++)
					s=s+mat.a[i][k]*x.a[k][j];
				rez.a[i][j]=s%666013;
			}
		return rez;
	}
}
int main()
{
freopen("iepuri.in","r",stdin);
freopen("iepuri.out","w",stdout);
scanf("%d",&n1);
for(i1=1;i1<=n1;i1++)
{
	scanf("%d",&a0);
	scanf("%d",&a1);
	scanf("%d",&a2);
	scanf("%d",&A);
	scanf("%d",&B);
	scanf("%d",&C);
	scanf("%d",&n);
	mat.a[1][1]=C;
	mat.a[1][2]=0;
	mat.a[1][3]=0;
	mat.a[2][1]=B;
	mat.a[2][2]=1;
	mat.a[2][3]=0;
	mat.a[3][1]=A;
	mat.a[3][2]=0;
	mat.a[3][3]=1;
	rez=pow(mat,n-1);
	printf("%d\n",((a0*rez.a[1][1])%666013+(a1*rez.a[2][1])%666013+(a2*rez.a[3][1])%666013)%666013);
}
return 0;
}