Cod sursa(job #2149627)

Utilizator catalinlupCatalin Lupau catalinlup Data 2 martie 2018 20:05:13
Problema Iepuri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.6 kb
#include <bits/stdc++.h>
#define INFILE "iepuri.in"
#define OUTFILE "iepuri.out"
using namespace std;
const int sz=3;
const int MOD=666013;
ifstream in(INFILE);
ofstream out(OUTFILE);
typedef array<array<int,sz>,sz> Mat;

void Init(Mat&a){
  for(int i=0;i<sz;i++){
    for(int j=0;j<sz;j++){
      a[i][j]=0;
    }
  }
}
Mat operator*(Mat a,Mat b){
  Mat c;
  for(int i=0;i<sz;i++){
    for(int j=0;j<sz;j++){
      int s=0;
      for(int k=0;k<sz;k++){
        s=s+a[i][k]*b[k][j];
        s=s%MOD;
      }
      c[i][j]=s;
    }
  }
  return c;
}
ostream& operator<<(ostream&os,Mat&a){
  for(int i=0;i<sz;i++){
    for(int j=0;j<sz;j++){
      os<<setw(2)<<a[i][j]<<" ";
    }
    os<<"\n";
  }
  os<<"\n";
  return os;
}

Mat putereLog(Mat a,int ex){
  Mat rasp;
  Init(rasp);
  rasp[0][0]=rasp[1][1]=rasp[2][2]=1;
//  cout<<rasp;
  while(ex>0){
    if(ex%2==1){
      ex--;
      rasp=rasp*a;
    }
    a=a*a;
    ex/=2;
  }
  return rasp;
}
void InitFib(Mat&a,int A,int B,int C){
  Init(a);
  a[0][2]=C;
  a[1][0]=1;
  a[1][2]=B;
  a[2][1]=1;
  a[2][2]=A;
}
void Determinare(int X,int Y,int Z,int A,int B,int C,int N){
  Mat a;
  N++;
  InitFib(a,A,B,C);
  a=putereLog(a,N-3);
  //cout<<a;
  int t1=(X*a[0][2])%MOD;
  int t2=(Y*a[1][2])%MOD;
  int t3=(Z*a[2][2])%MOD;
  int Fib=0;
  Fib+=t1;
  Fib=Fib%MOD;
  Fib+=t2;
  Fib=Fib%MOD;
  Fib+=t3;
  Fib=Fib%MOD;
  out<<Fib<<"\n";
}

int main(){
  int t;
  in>>t;
  for(int i=1;i<=t;i++){
    int X,Y,Z,A,B,C,N;
    in>>X>>Y>>Z>>A>>B>>C>>N;
    Determinare(X,Y,Z,A,B,C,N);
  }
  return 0;
}