Cod sursa(job #1136201)

Utilizator CostanMiriamCostan Miriam CostanMiriam Data 8 martie 2014 21:55:51
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.41 kb
#include <fstream>

using namespace std;

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

long long p[5][5],m[5][5],C[5][5],sol;
int a,b,c,x,y,z,n,t,i,j,k;

void inmulteste ( long long p[5][5], long long m[5][5], long long C[5][5] ) {

    int i,j,k;
    for (i=1;i<=3;i++)
        for (j=1;j<=3;j++)
            C[i][j]=0;

    for (i=1;i<=3;i++) {
        for (j=1;j<=3;j++)
            for (k=1;k<=3;k++) {
                C[i][j]+=((p[i][k])*(m[k][j]))%666013;
                C[i][j]%=666013;
            }
    }
}

void copiaza(long long a[5][5], long long b[5][5]){
    for (int i=1;i<=3;i++)
        for (int j=1;j<=3;j++)
            b[i][j]=a[i][j];
}

int main () {
    fin>>t;
    while (t--) {
        fin>>x>>y>>z;
        fin>>a>>b>>c>>n;

        for (i=1;i<=3;i++){
            for (j=1;j<=3;j++)
                p[i][j]=0;
            p[i][i]=1;
        }

        m[1][1]=a;
        m[1][2]=b;
        m[1][3]=c;
        m[2][1]=m[3][2]=1;
        m[2][2]=m[2][3]=m[3][1]=m[3][3]=0;

        n-=2;

        while (n!=0) {
            if (n%2==1) {
                inmulteste (p,m,C);
                copiaza (C,p);
            }
            inmulteste (m,m,C);
            copiaza (C,m);
            n/=2;
        }
        sol=((p[1][1]*z)%666013 +(p[1][2]*y)%666013 + (p[1][3]*x)%666013)%666013;
        fout<<sol<<"\n";
    }
    return 0;
}