Cod sursa(job #1142772)

Utilizator PatrikStepan Patrik Patrik Data 14 martie 2014 10:31:59
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.97 kb
    #include<cstdio>
    #include<cstring>
    using namespace std;
    #define MOD 666013
    int m[4][4]  , rez[4][4] , T , N , x0  ,x1 , x2 , A , B , C  , sol ;

    void powMod(int m[4][4] ,int N, int rez[4][4]);
    void multiply(int a[4][4] , int b[4][4]);

    int main()
    {
        freopen("iepuri.in" , "r" , stdin );
        freopen("iepuri.out" , "w" , stdout);
        scanf("%d" , &T );
        for(int i = 1 ; i <= T ; ++i )
        {
            scanf("%d%d%d%d%d%d%d" ,&x0 , &x1 , &x2 , &A , &B , &C ,  &N);
            memset(m,0,sizeof(m));
            memset(rez,0,sizeof(rez));
            m[1][2] = 1; m[2][3] = 1;
            m[3][1] = C; m[3][2] = B; m[3][3] = A;
            powMod(m,N-2,rez);
            sol = ((1ll*rez[3][1] * x0)%MOD + (1ll*rez[3][2]*x1)%MOD + (1ll*rez[3][3]*x2)%MOD)%MOD;
            printf("%d\n" , sol);
        }
        return 0;
    }

    void powMod(int m[4][4] , int N , int rez[4][4] )
    {
        if(N == 1)
        {
            for(int i = 1 ; i<= 3 ; ++i )
                for(int j = 1 ; j <= 3 ; ++j )
                    rez[i][j] = m[i][j];
            return;
        }
        if(N%2)
        {
            int aux[4][4];
            memset(aux,0,sizeof(aux));
            for(int i = 1 ; i <= 3 ; ++i )
                for(int j = 1 ; j <= 3 ; ++j )aux[i][j] = m[i][j];
            multiply(m,m);
            powMod(m,(N-1)/2,rez);
            multiply(rez,aux);
        }
        else
        {
            multiply(m,m);
            powMod(m,N/2,rez);
        }
    }

    void multiply(int a[4][4] , int b[4][4])
    {
        int c[4][4];
        memset(c,0,sizeof(c));
        for(int i = 1 ; i <= 3 ; ++i )
            for(int j = 1 ; j <= 3 ; ++j )
                for(int k = 1 ; k <= 3 ; ++k )
                    c[i][j] += (1ll*a[i][k]*b[k][j])%MOD;
        for(int i = 1 ; i <= 3 ; ++i )
            for(int j = 1 ; j <= 3 ; ++j )
                a[i][j] = c[i][j];
    }