Cod sursa(job #1348064)

Utilizator fluture.godlikeGafton Mihnea Alexandru fluture.godlike Data 19 februarie 2015 14:57:11
Problema Iepuri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.61 kb
#include <stdio.h>
#define MOD 666013
FILE *fin, *fout;
int t, x, y, z, a, b, c, n, rasp;
struct mat
{
       int v[3][3];
} r, w, null;
mat inmultire(mat a1, mat a2)
{
    mat ans;
    ans.v[0][0] = (a1.v[0][0]*a2.v[0][0])%MOD + (a1.v[0][1]*a2.v[1][0])%MOD + (a1.v[0][2]*a2.v[2][0])%MOD;
    ans.v[0][1] = (a1.v[0][0]*a2.v[0][1])%MOD + (a1.v[0][1]*a2.v[1][1])%MOD + (a1.v[0][2]*a2.v[2][1])%MOD;
    ans.v[0][2] = (a1.v[0][0]*a2.v[0][2])%MOD + (a1.v[0][1]*a2.v[1][2])%MOD + (a1.v[0][2]*a2.v[2][2])%MOD;
    ans.v[1][0] = (a1.v[1][0]*a2.v[0][0])%MOD + (a1.v[1][1]*a2.v[1][0])%MOD + (a1.v[1][2]*a2.v[2][0])%MOD;
    ans.v[1][1] = (a1.v[1][0]*a2.v[0][1])%MOD + (a1.v[1][1]*a2.v[1][1])%MOD + (a1.v[1][2]*a2.v[2][1])%MOD;
    ans.v[1][2] = (a1.v[1][0]*a2.v[0][2])%MOD + (a1.v[1][1]*a2.v[1][2])%MOD + (a1.v[1][2]*a2.v[2][2])%MOD;
    ans.v[2][0] = (a1.v[2][0]*a2.v[0][0])%MOD + (a1.v[2][1]*a2.v[1][0])%MOD + (a1.v[2][2]*a2.v[2][0])%MOD;
    ans.v[2][1] = (a1.v[2][0]*a2.v[0][1])%MOD + (a1.v[2][1]*a2.v[1][1])%MOD + (a1.v[2][2]*a2.v[2][1])%MOD;
    ans.v[2][2] = (a1.v[2][0]*a2.v[0][2])%MOD + (a1.v[2][1]*a2.v[1][2])%MOD + (a1.v[2][2]*a2.v[2][2])%MOD;
    for(int i = 0; i< 3; i++)
    {
            for(int j = 0; j< 3; j++)
            {
                    ans.v[i][j]%=MOD;
            }
    }
    return ans;
}
mat power(mat a1, int a2)
{
    if(a2 == 0) return null;
    if(a2 == 1) return a1;
    mat temp = power(a1, a2/2);
    return inmultire(inmultire(temp, temp), power(a1, a2%2));
}
int main()
{
    fin =freopen("iepuri.in", "r", stdin);
    fout = freopen("iepuri.out", "w", stdout);
    scanf("%d", &t);
    null.v[0][0] = 1;
    null.v[0][1] = 0;
    null.v[0][2] = 0;
    null.v[1][0] = 0;
    null.v[1][1] = 1;
    null.v[1][2] = 0;
    null.v[2][0] = 0;
    null.v[2][1] = 0;
    null.v[2][2] = 1;
    for(int i = 0; i< t; i++)
    {
            scanf("%d %d %d %d %d %d %d", &x, &y, &z, &a, &b, &c, &n);
            r.v[0][0] = 0;
            r.v[0][1] = 0;
            r.v[0][2] = c;
            r.v[1][0] = 1;
            r.v[1][1] = 0;
            r.v[1][2] = b;
            r.v[2][0] = 0;
            r.v[2][1] = 1;
            r.v[2][2] = a;
            w = power(r, n-2);
            rasp = x*w.v[0][2] + y*w.v[1][2] + z*w.v[2][2];
            /*for(int j= 0; j< 3; j++)
            {
                    for(int k = 0; k< 3; k++)
                    {
                            printf("%d ", w.v[j][k]);
                    }
                    printf("\n");
            }*/
            printf("%d\n", rasp%MOD);
    }
    fclose(fin);
    fclose(fout);
    return 0;
}