Cod sursa(job #266033)

Utilizator TottiRus TIberiu Gabriel Totti Data 24 februarie 2009 20:59:03
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.35 kb
#include <iostream>  
#include <fstream>  
#include <cmath>  
using namespace std;  
#define MOD 666013   
#define input  "iepuri.in"  
#define output "iepuri.out"  
ifstream fin (input);  
ofstream fout(output);  
long iep(long n);  
long t,x,y,z,a,b,c,n,i;   
long long M[4][4], I3[4][4];  
void mult();  
void mult1();  
int main()  
{  
fin >> t;  
for (i = 1; i <= t; i ++ )  
{fin >> x >> y >> z >> a >> b >> c >> n;  
M[1][1]=M[1][3]=M[2][1]=M[2][2]=0;  
M[1][2]=M[2][3]=1;  
M[3][1]=c;  
M[3][2]=b;  
M[3][3]=a;  
I3[1][1]=1;I3[2][2]=1;I3[3][3]=1;I3[1][2]=0;I3[1][3]=0;  
I3[2][1]=0;I3[2][3]=0;I3[3][1]=0;I3[3][2]=0;  
// ridicare la putere in timp logaritmic           
while (n)  
{if (n&1) mult1();  
mult();  
n>>=1;}  
// tiparire;  
fout << ((I3[1][1]*x)%MOD+(I3[1][2]*y)%MOD+(I3[1][3]*z)%MOD)%MOD << "\n";  }          
return 0;  }  
void mult()  
{int i,j,l;  
long long S[4][4];  
for (i=1;i<=3;i++)  
for (j=1;j<=3;j++)  
{S[i][j]=0;  
for (l=1;l<=3;l++)  
S[i][j] = (S[i][j]+(M[i][l]*M[l][j])%MOD)%MOD;}  
for (i=1;i<=3;i++)  
for (j=1;j<=3;j++)  
M[i][j]=S[i][j];}  
void mult1()  
{int i,j,l;  
long long S[4][4];  
for (i=1;i<=3;i++)  
for (j=1;j<=3;j++)  
{S[i][j]=0;  
for (l=1;l<=3;l++)  
S[i][j] = (S[i][j]+(I3[i][l]*M[l][j])%MOD)%MOD;}  
for (i=1;i<=3;i++)  
for (j=1;j<=3;j++)  
I3[i][j]=S[i][j];}