Cod sursa(job #286210)

Utilizator crawlerPuni Andrei Paul crawler Data 23 martie 2009 16:33:27
Problema Iepuri Scor 100
Compilator cpp Status done
Runda qwerty-1 Marime 1.25 kb
#include <stdio.h>


#define f(w) for (int w=0;w<3;++w)
void mul(int a[3][3],int b[3][3])
{
     int c[3][3];
     f(i) f(j)
     {
          c[i][j] = 0;
          f(k) c[i][j] = ((long long)c[i][j] + (long long)a[i][k]*(long long)b[k][j])%666013ll;     
     }
     f(i) f(j) a[i][j] = c[i][j];
}

void solve()
{
     int a,b,c,x,y,z,n;
     
     scanf("%d%d%d%d%d%d%d", &x,&y,&z,&a,&b,&c,&n);     

     n -= 2;
     
     int tmp[3][3], ret[3][3];
     
     f(i) f(j) ret[i][j] = (i==j)?1:0, tmp[i][j] = 0;
     tmp[0][0] = a;
     tmp[0][1] = b;
     tmp[0][2] = c;
     tmp[1][0] = 1;
     tmp[2][1] = 1;
     
     while (n)
     {
          if (n&1)  mul(ret,tmp);
          mul(tmp,tmp);
          n /= 2;     
     }
     
     long long sol = 0;
     
     sol = ((long long)sol+(long long)ret[0][0]*(long long)z)%666013ll;
     sol = ((long long)sol+(long long)ret[0][1]*(long long)y)%666013ll;
     sol = ((long long)sol+(long long)ret[0][2]*(long long)x)%666013ll;
     
     printf("%lld\n", sol);
}

int main()
{
     freopen("iepuri.in","r",stdin);
     freopen("iepuri.out","w",stdout);
     
     int t;
     
     scanf("%d", &t);
     
     while (t--)
          solve();
     
     return 0;     
}