Cod sursa(job #357831)

Utilizator eudanipEugenie Daniel Posdarascu eudanip Data 20 octombrie 2009 20:07:28
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.35 kb
#include<stdio.h>
#define MOD 666013
#define ll long long
int r[4][4],m[4][4],t,x,y,z,a,b,c,n;
int nrbit (int x )
{
int nr=0;
 while(x)
 {
 nr++;
 x=x/2;
 }
 return nr;
}
void inm (int a[4][4],int b[4][4]) // a = a * b
{
    int i, j, k, s = 0, c[4][4];

    for (i = 1; i <= 3; i++)
        for (j = 1; j <= 3; ++j)
        {
            s = 0;
            for (k = 1; k <= 3; ++k)
                s = ((ll)s + (ll)a[i][k] * b[k][j]) % MOD;
            c[i][j] = s;
        }
    for (i = 1; i <= 3; i++)
        for (j = 1; j <= 3; j++)
            a[i][j] = c[i][j];
}
void inmul (int k,int nr)
{
    int i,j;

    for(i=1;i<=3;i++)
       for(j=1;j<=3;j++)
            r[i][j] = (i == j);
               
    for( i=nr-1;i>=0;i--)
    {
        inm(r,r);
        if(k&(1<<i))
            inm(r, m);
    }
}
int main ()
{
    int i, k, nr, s2;
    freopen("iepuri.in","r",stdin);
    freopen("iepuri.out","w",stdout);
    scanf("%d",&t);
    for(i=1;i<=t;i++)
    {
       scanf("%d%d%d%d%d%d%d",&x,&y,&z,&a,&b,&c,&n);
       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=n-2;
       nr=nrbit(k);
       inmul(k,nr);
       s2=((ll)x*r[3][1])%MOD+((ll)y*r[3][2])%MOD+((ll)z*r[3][3])%MOD;
       printf("%d\n",s2%MOD);
    }
    
    return 0;
}