Mai intai trebuie sa te autentifici.

Cod sursa(job #1242553)

Utilizator gapdanPopescu George gapdan Data 14 octombrie 2014 17:46:46
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.51 kb
#include<cstdio>
#define mod 666013
using namespace std;
long long m[4][4],mat[4][4],p[4][4],x,y,z,n,a,b,c,sol;
int l,r,k,b2[100001],T;
void transf(int nr)
{
    while (nr!=0)
    {
        b2[++k]=nr%2;
        nr=nr/2;
    }
}
int main()
{
    freopen("iepuri.in","r",stdin);
    freopen("iepuri.out","w",stdout);
    scanf("%d",&T);
    if (T!=0)
    do
    {
      scanf("%d%d%d%d%d%d%d",&x,&y,&z,&a,&b,&c,&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]=c; m[3][2]=b; m[3][3]=a;
      k=0;
      transf(n);
      for (int i=k;i>=1;--i)
      {
          for(l=1;l<=3;++l)
            for (r=1;r<=3;++r)
                p[l][r]=((mat[l][1]*mat[1][r])%mod+(mat[l][2]*mat[2][r])%mod+(mat[l][3]*mat[3][r])%mod)%mod;
          if (b2[i]%2==1)
          {
              //p=p^2*A;
              for(l=1;l<=3;++l)
                for (r=1;r<=3;++r)
                    mat[l][r]=p[l][r];
              for(l=1;l<=3;++l)
                for (r=1;r<=3;++r)
                p[l][r]=((mat[l][1]*m[1][r])%mod+(mat[l][2]*m[2][r])%mod+(mat[l][3]*m[3][r])%mod)%mod;
          }
             for(l=1;l<=3;++l)
                for (r=1;r<=3;++r)
                    mat[l][r]=p[l][r];
      }
      sol=((mat[1][1]*x)%mod+(mat[1][2]*y)%mod+(mat[1][3]*z)%mod)%mod;
      printf("%lld\n",sol);
      --T;
    }while (T>0);
    return 0;
}