Cod sursa(job #233548)

Utilizator vlad_DVlad Dumitriu vlad_D Data 18 decembrie 2008 09:56:21
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.48 kb
#include <fstream>

using namespace std;
typedef long long int62;
    ifstream fin("iepuri.in");
int62 baza[3][3]; //baza
int62 ans[3][3];
int62 mod = 666013;
void patrat() {
     int62 ret[3][3];
     memset(ret, 0, sizeof(ret));
     int62 i, j, k;
     for (i = 0; i < 3; ++i)
         for (j = 0; j < 3; ++j) for (k = 0; k < 3; ++k) ret[i][j]+=ans[i][k]*ans[k][j], ret[i][j]%=mod;
     memcpy(ans, ret, sizeof(ans));
     
     }
void oribaza() {
     int62 ret[3][3];
     memset(ret, 0, sizeof(ret));
     int i, j, k;
     for (i = 0; i < 3; ++i)
     for (j = 0; j < 3; ++j)
     for (k = 0; k < 3; ++k) ret[i][j]+=ans[i][k]*baza[k][j],ret[i][j]%=mod;
     
     memcpy(ans, ret, sizeof(ans));     
     }
void divide(int62 n) {
     if (n == 1) {
           memcpy(ans, baza, sizeof(ans));
           return;
           }
     divide(n/2);
     //acum in ans ^ (n/2)
     patrat();
     if (n % 2) oribaza();
     }
ofstream fout("iepuri.out");
void go() {
     //X Y Z A B C N
     int62 x, y, z, a, b, c, n;
     fin >> x >> y >> z >> a >> b >> c >> n;
     memset(baza, 0, sizeof(baza));
     
     baza[0][1] = 1;
     baza[1][2] = 1;
     baza[2][0] = c % mod; baza[2][1] = b % mod; baza[2][2] = a % mod;
     
     divide(n);    
     fout << (x*ans[0][0] + y*ans[0][1] + z*ans[0][2])%mod << '\n';
     }
int main() {

    
 
    int t;
    fin >> t;
    while (t > 0) {
          go();
          --t;
          }
    return 0;
    }