Cod sursa(job #1498876)

Utilizator DrumeaVDrumea Vasile DrumeaV Data 9 octombrie 2015 18:08:22
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.62 kb
#include <stdio.h>
#include <string.h>
#include <algorithm>

using namespace std;

const int Md = 666013;

int Nextint()
{
    char S[100];
    int Num = 0,i = 0;
    bool Neg = 0;

    scanf("%s",S);

    if (S[0] == '-')
        Neg = 1,i++;

    for (;i < strlen(S);i++)
        Num = Num * 10 + (S[i] - '0');

    if (Neg)
        Num *= -1;

    return Num;
}

int T,N,A,B,C,X,Y,Z;
int M1[3][3];

void Mult(int A[3][3],int B[3][3],int C[3][3])
{
    for (int i = 0;i < 3;i++)
        for (int j = 0;j < 3;j++)
            C[i][j] = 0;

    for (int i = 0;i < 3;i++)
        for (int j = 0;j < 3;j++)
            for (int k = 0;k < 3;k++)
                C[i][j] += (1LL * A[i][k] * B[k][j]) % Md;
}

void GetPow(int N)
{
    int M2[3][3],M3[3][3];

    memcpy(M2,M1,sizeof(M2));

    while (N)
    {
        if (N & 1)
        {
            Mult(M1,M2,M3);
            memcpy(M1,M3,sizeof(M1));
        }

        Mult(M2,M2,M3);
        memcpy(M2,M3,sizeof(M2));

        N >>= 1;
    }
}

int main()
{
    freopen("iepuri.in","r",stdin);
    freopen("iepuri.out","w",stdout);

     T = Nextint();

     while (T--)
     {
         X = Nextint();Y = Nextint();Z = Nextint();
         A = Nextint();B = Nextint();C = Nextint();
         N = Nextint();

         M1[0][0] = 0;M1[0][1] = 1;M1[0][2] = 0;
         M1[1][0] = 0;M1[1][1] = 0;M1[1][2] = 1;
         M1[2][0] = C;M1[2][1] = B;M1[2][2] = A;

         GetPow(N - 1);

         printf("%d\n",((1LL * M1[0][0] * X) % Md + (1LL * M1[0][1] * Y) % Md + (1LL * M1[0][2] * Z) % Md) % Md);
     }

  return 0;
}