Cod sursa(job #1255987)

Utilizator IonSebastianIon Sebastian IonSebastian Data 5 noiembrie 2014 17:45:20
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.37 kb
#include <fstream>

using namespace std;

ifstream in("iepuri.in");
ofstream out("iepuri.out");

const int mod=666013;

int p[3][3]={{0,0,0},{1,0,0},{0,1,0}};
int m[3][3] = {{1,0,0},{0,1,0},{0,0,1}};

void inmultire(int a[3][3], int b[3][3])
{
    int aux[3][3];
    for(int i = 0; i < 3; i++)
    {
        aux[i][0] = (1LL*a[i][0]*b[0][0]+1LL*a[i][1]*b[1][0] + 1LL*a[i][2]*b[2][0])%mod;
        aux[i][1] = (1LL*a[i][0]*b[0][1]+1LL*a[i][1]*b[1][1] + 1LL*a[i][2]*b[2][1])%mod;
        aux[i][2] = (1LL*a[i][0]*b[0][2]+1LL*a[i][1]*b[1][2] + 1LL*a[i][2]*b[2][2])%mod;
    }
    for(int i = 0; i < 3; i++)
    {
        for(int j = 0; j < 3; j++)
        {
            a[i][j] = aux[i][j];
        }
    }
}

void nriepuri(int n){
    while(n!=0)
    {
        if((n&1)==1)
        {
            inmultire(m,p);
        }
        inmultire(p,p);
        n >>= 1;
    }


}

int main(){

    int t,x,y,z,a,b,c,n;

    in>>t;

    while(t>0){
        in>>x>>y>>z>>a>>b>>c>>n;
        for(int i = 0; i < 3; i++)
        {
            for(int j = 0; j < 3; j++)
            {
                m[i][j] = 0;
                p[i][j] = 0;
            }
            m[i][i] = 1;
        }
        p[1][0] = 1;
        p[2][1] = 1;
        p[0][0]=a;
        p[0][1]=b;
        p[0][2]=c;
        nriepuri(n-2);
        out <<  (1LL*m[0][0]*z+1LL*m[0][1]*y+1LL*m[0][2]*x)%mod << "\n";
        t--;
    }
    return 0;
}