Cod sursa(job #2647896)

Utilizator anabatAna Batrineanu anabat Data 7 septembrie 2020 10:16:13
Problema Iepuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.8 kb
#include <stdio.h>

using namespace std;

#define MOD 666013

struct Matrice {
  long long a1,a2,a3,a4,a5,a6,a7,a8,a9;
};

Matrice matrez,matbaza,matinit;

Matrice inmultire(Matrice A,Matrice B){ ///inm mat A cu mat B
  Matrice rez;
  rez.a1=((A.a1*B.a1)%MOD+(A.a2*B.a4)%MOD+(A.a3*B.a7)%MOD)%MOD;
  rez.a2=((A.a1*B.a2)%MOD+(A.a2*B.a5)%MOD+(A.a3*B.a8)%MOD)%MOD;
  rez.a3=((A.a1*B.a3)%MOD+(A.a2*B.a6)%MOD+(A.a3*B.a9)%MOD)%MOD;
  rez.a4=((A.a4*B.a1)%MOD+(A.a5*B.a4)%MOD+(A.a6*B.a7)%MOD)%MOD;
  rez.a5=((A.a4*B.a2)%MOD+(A.a5*B.a5)%MOD+(A.a6*B.a8)%MOD)%MOD;
  rez.a6=((A.a4*B.a3)%MOD+(A.a5*B.a6)%MOD+(A.a6*B.a9)%MOD)%MOD;
  rez.a7=((A.a7*B.a1)%MOD+(A.a8*B.a4)%MOD+(A.a9*B.a7)%MOD)%MOD;
  rez.a8=((A.a7*B.a2)%MOD+(A.a8*B.a5)%MOD+(A.a9*B.a8)%MOD)%MOD;
  rez.a9=((A.a7*B.a3)%MOD+(A.a8*B.a6)%MOD+(A.a9*B.a9)%MOD)%MOD;
  return rez;
}

int main()
{
  FILE *fin,*fout;
  fin=fopen("iepuri.in","r");
  fout=fopen("iepuri.out","w");

  long long T,n,z0,z1,z2,A,B,C,i;
  fscanf(fin,"%lld",&T);
  for(i=0;i<T;i++){
    fscanf(fin,"%lld%lld%lld%lld%lld%lld%lld",&z0,&z1,&z2,&A,&B,&C,&n);
    matbaza.a1=matbaza.a2=matbaza.a5=matbaza.a7=0; ///matricea constanta
    matbaza.a4=matbaza.a8=1;
    matbaza.a3=C;
    matbaza.a6=B;
    matbaza.a9=A;
    matrez.a1=matrez.a5=matrez.a9=1;
    matrez.a2=matrez.a3=matrez.a4=matrez.a6=matrez.a7=matrez.a8=0; ///matricea rezultata - o initializam cu mat identitate
    matinit.a1=z0;
    matinit.a2=z1;
    matinit.a3=z2;
    n--; ///matbaza^n-1
    while(n>0){
      if(n%2==0){
        matbaza=inmultire(matbaza,matbaza);
        n/=2;
      }
      else{
        matrez=inmultire(matrez,matbaza);
        n--;
      }
    }
   matrez=inmultire(matinit,matrez);
   fprintf(fout,"%lld\n",matrez.a2);
  }

  fclose(fin);
  fclose(fout);

  return 0;
}