Cod sursa(job #919608)

Utilizator Raulr100Florian Raul Raulr100 Data 19 martie 2013 19:06:40
Problema Iepuri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.22 kb
#include <iostream>
#include <fstream>
#include <limits.h>
using namespace std;
#define ULL unsigned long long
const int M=666013;
int N,A,B,C,X,Y,Z;
ULL a[4][4],sol[4][4];

void inmultire(ULL a[4][4], ULL b[4][4])
{
    ULL c[4][4];
    int i,j;
    for(i=1; i<=3; ++i)
        for(j=1; j<=3; ++j)
            c[i][j]=(a[i][1]*b[1][j]+a[i][2]*b[2][j]+a[i][3]*b[3][j]);
    for(i=1; i<=3; ++i)
        for(j=1; j<=3; ++j)
            a[i][j]=c[i][j];
}

void putere(int p)
{
    int k;
    for(k=0; (1<<k)<=p; ++k)
    {

        if((1<<k)&p)
            inmultire(sol,a);
        inmultire(a,a);
    }
}

int main()
{
    ifstream f("iepuri.in");
    ofstream g("iepuri.out");
    int nr_set,i,j,k;
    f >> nr_set;
    for(k=1; k<=nr_set; ++k)
    {
        f >> X >> Y >> Z >> A >> B >> C >> N;
        for(i=1; i<=3; i++)
            for(j=1; j<=3; j++)
                a[i][j]=a[j][i]=sol[i][j]=sol[j][i]=0;
        a[1][1]=A;
        a[1][2]=B;
        a[1][3]=C;
        a[2][1]=1;
        a[3][2]=1;
        sol[1][1]=sol[2][2]=sol[3][3]=1;
        putere(N-2);
        g << (sol[1][1]*Z + sol[1][2]*Y + sol[1][3]*X)%M << endl;
    }
    f.close();
    g.close();
    return 0;
}