Pagini recente » Cod sursa (job #2333339) | Cod sursa (job #1851453) | Istoria paginii utilizator/petradutu | Cod sursa (job #2040728) | Cod sursa (job #235044)
Cod sursa(job #235044)
#include <cstdio>
#define M 666013
long long A[4][4],rez[4][4],rez2[4][4],V[4],i,j,j2,k,put;
int t,x,y,z,a,b,c;
void inmulteste(long long A[4][4], long long B[4][4])
{
//inmulteste A cu B, memorand rezultatul in rez2
int i,j,j2;
for (i=1; i<=3; i++)
for (j=1; j<=3; j++) rez2[i][j]=0;
for (i=1; i<=3; i++)
for (j=1; j<=3; j++)
for (j2=1; j2<=3; j2++) rez2[i][j]=(rez2[i][j]+(A[i][j2]*B[j2][j])%M)%M;
}
int main()
{
freopen("iepuri.in","r",stdin);
freopen("iepuri.out","w",stdout);
scanf("%d\n",&t);
for (; t; t--)
{
scanf("%d %d %d %d %d %d %d",&x,&y,&z,&a,&b,&c,&put);
A[1][2]=1; A[2][3]=1;
A[3][1]=c%M; A[3][2]=b%M; A[3][3]=a%M;
V[1]=x; V[2]=y; V[3]=z;
//rez se initializeaza cu matricea unitate,
//care e termen neutru in inmulturea matricelor
for (i=1; i<=3; i++) rez[i][i]=1;
//ridicarea la putere a matricei A in timp logaritmic,
//rezultatul memorandu-se in rez
for (k=1; k<=put; k<<=1)
{
if (k&put)
{
inmulteste(rez,A);
for (i=1; i<=3; i++)
for (j=1; j<=3; j++) rez[i][j]=rez2[i][j];
}
inmulteste(A,A);
for (i=1; i<=3; i++)
for (j=1; j<=3; j++) A[i][j]=rez2[i][j];
}
k=0;
printf("%lld\n",((rez[1][1]*V[1])%M+(rez[1][2]*V[2])%M+(rez[1][3]*V[3]%M))%M);
for (i=1; i<=3; i++)
for (j=1; j<=3; j++) rez[i][j]=0, A[i][j]=0;
}
return 0;
}