Cod sursa(job #3252953)

Utilizator David_PoterasuDavid Poterasu David_Poterasu Data 31 octombrie 2024 16:20:22
Problema Iepuri Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.3 kb
#include <bits/stdc++.h>

using namespace std;

ifstream in("iepuri.in");
ofstream out("iepuri.out");

const int MOD=666013;
int x, y, z, a, b, c, n;
int ans[4][4];

void inmultire(int m[4][4], int m2[4][4])
{
  int aux[4][4]={0};
  for(int i=1; i<=3; i++)
  {
    for(int j=1; j<=3; j++)
    {
      for(int k=1; k<=3; k++)
      {
        aux[i][j]+=(m[i][k]*m2[k][j])%MOD;
      }
    }
  }
  for(int i=1; i<=3; i++)
  {
    for(int j=1; j<=3; j++)
    {
      ans[i][j]=aux[i][j];
    }
  }
}

void exp_rapida(int x, int mat[4][4])
{
  int cx=x;
  for(int i=1; i<=3; i++)
  {
    for(int j=1; j<=3; j++)
    {
      ans[i][j]=mat[i][j];
    }
  }
  while(x>1)
  {
    inmultire(ans, ans);
    x/=2;
  }
  if(cx%2)
  {
    inmultire(ans, mat);
  }
}

void solve_test()
{
  in>>x>>y>>z>>a>>b>>c>>n;
  int mat[4][4]=
  {
    {0},
    {0, 0, 1, 0},
    {0, 0, 0, 1},
    {0, c, b, a}
  };

  for(int i=1; i<=3; i++)
  {
    for(int j=1; j<=3; j++)
    {
      ans[i][j]=mat[i][j];
    }
  }

  if(n==3)
  {
    out<<a*z%MOD+b*y%MOD+c*x%MOD<<'\n';
    return;
  }
  exp_rapida(n-2, mat);

  out<<ans[3][1]*x+ans[3][2]*y+ans[3][3]*z<<'\n';
}

int main()
{
    int t;
    in>>t;
    while(t--)
    {
      solve_test();
    }
    return 0;
}