Cod sursa(job #191336)

Utilizator MciprianMMciprianM MciprianM Data 26 mai 2008 07:53:52
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.66 kb
#include<fstream.h>
//using namespace std;
long long a[200][3][3];/*
a[i]  matricea a[1] la puterea 2^i
deci a un sir de matrici 1,m,m^2, ...,m^32
*/
long long T,X,Y,Z,A,B,C,N;
ofstream g("iepuri.out");
void raspuns(long long d[][3]){
  long long r=d[0][0]*Z+d[0][1]*Y+d[0][2]*X;
  g<<(r%666013)<<'\n';
}
void inm(long long m1[3][3],long long  m2[3][3], long long  m3[3][3]){
  long long  i, j, k,s;
  for(i=0;i<3;i++)
    for(j=0;j<3;j++){
      s=0;
      for(k=0;k<3;k++){
	s+=(m1[i][k]*m2[k][j]%666013);
	s=s%666013;
      }
      m3[i][j]=s;
    }
}
void constr(){
  long long  i;
  for(i=1;((long long)1<<i)<=N;i++)
    inm(a[i-1],a[i-1],a[i]);
}
void initi(long long  d[][3]){
  d[0][0]=1;
  d[0][1]=0;
  d[0][2]=0;

  d[1][0]=0;
  d[1][1]=1;
  d[1][2]=0;

  d[2][0]=0;
  d[2][1]=0;
  d[2][2]=1;


}
void copy(long long  d[][3],long long  e[][3]){
  long long  i, j;
  for(i=0;i<3;i++)
	   for(j=0;j<3;j++)
		   d[i][j]=e[i][j];

}

void final(){
  long long  cont=0;
  N-=2;
  long long  d[3][3],e[3][3];
  initi(d);
  while(N){
    if(N&1){

       inm(d,a[cont],e);
	   copy(d,e);
    }
    N>>=1;
    cont++;
  }
  raspuns(d);
}
void init(){
  a[0][0][0]=A;
  a[0][0][1]=B;
  a[0][0][2]=C;

  a[0][1][0]=1;
  a[0][1][1]=0;
  a[0][1][2]=0;

  a[0][2][0]=0;
  a[0][2][1]=1;
  a[0][2][2]=0;
}

int  main(){
  long long  k;
  ifstream fisier("iepuri.in");
  fisier>>T;
  for(k=0;k<T;k++){
    fisier>>X>>Y>>Z>>A>>B>>C>>N;
    init();
    constr();
    if(N==0)
      g<<A<<'\n';
    else if(N==1)
	   g<<B<<'\n';
    else if(N==2)
	 g<<C<<'\n';
	 else final();
  }
  g.close();
  return 0;
}