Cod sursa(job #694358)

Utilizator ioalexno1Alexandru Bunget ioalexno1 Data 27 februarie 2012 20:10:31
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.45 kb
#include <cstdio>
#define mod 666013
using namespace std;
int bit[100],n,k;
long long mat[4][4],m[4][4],p[4][4];
void base_2()
{
while(n>0)
    {
    bit[++k]=n%2; n/=2;
    }
}
int main()
{ int i,h,l,c1,a,b,x,y,z,t;
  long long sol,c;
freopen("iepuri.in","r",stdin); scanf("%d\n",&t);
freopen("iepuri.out","w",stdout);
for(h=1;h<=t;++h)
    {
    scanf("%d %d %d %d %d %d %d\n",&x,&y,&z,&a,&b,&c1,&n);
    mat[1][1]=1; mat[1][2]=0; mat[1][3]=0; mat[2][1]=0; mat[2][2]=1; mat[2][3]=0;
    mat[3][1]=0; mat[3][2]=0; mat[3][3]=1;
    m[1][1]=0; m[1][2]=1; m[1][3]=0; m[2][1]=0; m[2][2]=0; m[2][3]=1;
    m[3][1]=c1; m[3][2]=b; m[3][3]=a;
    k=0; base_2();
    for(i=k;i>=1;--i)
        {
        for(l=1;l<=3;++l)
            for(c=1;c<=3;++c)
    p[l][c]=((mat[l][1]*mat[1][c])%mod+(mat[l][2]*mat[2][c])%mod+(mat[l][3]*mat[3][c])%mod)%mod;
        if(bit[i]==1)
                {
                for(l=1;l<=3;++l)
                    for(c=1;c<=3;++c)
                        mat[l][c]=p[l][c];
                for(l=1;l<=3;++l)
                    for(c=1;c<=3;++c)
                p[l][c]=((mat[l][1]*m[1][c])%mod+(mat[l][2]*m[2][c])%mod+(mat[l][3]*m[3][c])%mod)%mod;
                }
        for(l=1;l<=3;++l)
            for(c=1;c<=3;++c)
                mat[l][c]=p[l][c];
        }
    sol=((mat[1][1]*x)%mod+(mat[1][2]*y)%mod+(mat[1][3]*z)%mod)%mod;
    printf("%d\n",sol);
    }
fclose(stdin);
fclose(stdout);
return 0;
}