Cod sursa(job #2770631)

Utilizator Ilie_MityIlie Dumitru Ilie_Mity Data 22 august 2021 13:12:03
Problema Iepuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.29 kb
//Ilie Dumitru
#include<cstdio>
#define MOD 666013
#define mult(i, j, k) for(x=0;x<3;++x)for(y=0;y<3;++y){k[x][y]=0;for(z=0;z<3;++z)k[x][y]=(k[x][y]+i[x][z]*j[z][y])%MOD;}
#define assign(i, j) for(x=0;x<3;++x)for(y=0;y<3;++y)i[x][y]=j[x][y];

typedef long long ll;

ll m0[3][3]={{0, 1, 0}, {0, 0, 1}, {0, 0, 0}}, m[3][3], aux[3][3], aux0[3][3];
int x, y, z;

void fastExp(int N)
{
    if(N)
    {
        fastExp(N>>1);
        mult(m, m, aux)
        if(N&1)
        {
            mult(aux, m0, aux0)
            assign(m, aux0)
        }
        else
        {
            assign(m, aux);
        }
    }
    printf("%d\n", N);
    for(x=0;x<3;++x)
    {
        for(y=0;y<3;++y)
            printf("%I64d ", m[x][y]);
        printf("\n");
    }
}

int main()
{
    FILE *f=fopen("iepuri.in", "r"), *g=fopen("iepuri.out", "w");
    int A, B, C, X, Y, Z, N, _, i, j;
    fscanf(f, "%d", &_);
    while(_--)
    {
        fscanf(f, "%d%d%d%d%d%d%d", &X, &Y, &Z, &A, &B, &C, &N);
        for(i=0;i<3;++i)
            for(j=0;j<3;++j)
                m[i][j]=(i==j);
        m0[2][0]=C;
        m0[2][1]=B;
        m0[2][2]=A;
        fastExp(N-2);
        fprintf(g, "%I64d\n", (m[2][0]*X+m[2][1]*Y+m[2][2]*Z)%MOD);
    }
    fclose(f);
    fclose(g);
    return 0;
}