Cod sursa(job #1138846)

Utilizator Daniel3717Aleca Daniel Adrian Daniel3717 Data 10 martie 2014 17:39:14
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.9 kb
#include <iostream>
#include <fstream>
using namespace std;

#define mod 666013

struct matrix
{
    // e o matrice 3 X 3
    int x[4][4];
} mi,mf;

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

void add(int &nr,int nr1)
{
    nr+=nr1;
    while (nr>mod)
        nr-=mod;
    while (nr<0)
        nr+=mod;
}

int times(int nr1,int nr2)
{
    int nr=1LL*nr1*nr2%mod;
    return nr;
}

matrix operator * (matrix m1,matrix m2)
{
    matrix r;

    int l,c,i;

    for (l=0;l<=3;l++)
        for (c=0;c<=3;c++)
            r.x[l][c]=0;

    for (l=1;l<=3;l++)
        for (c=1;c<=3;c++)
            for (i=1;i<=3;i++)
                add(r.x[l][c],times(m1.x[l][i],m2.x[i][c]));
    return r;
}

matrix powmatrix3(matrix m,int n)
{
    if (n==1)
        return m;

    matrix axm,rm;
    int l,c;

    if (n%2==1)
        rm=m;
    else
    {
        for (l=0;l<=3;l++)
            for (c=0;c<=3;c++)
                if (l==c)
                    rm.x[l][c]=1;
                else
                    rm.x[l][c]=0;
    }
    axm=powmatrix3(m,n/2);

    rm=rm*axm;

    rm=rm*axm;

    return rm;
}


int main(void)
{
    FILE * f;
    f=fopen("iepuri.in","r");
    ofstream g("iepuri.out");
    fscanf(f,"%d",&t);
    for (it=1;it<=t;it++)
    {
        fscanf(f,"%d%d%d%d%d%d%d",&x,&y,&z,&a,&b,&c,&n);

        mi.x[0][0]=mi.x[0][1]=mi.x[0][2]=mi.x[0][3]=mi.x[1][0]=mi.x[2][0]=mi.x[3][0]=0;
        mi.x[1][1]=a;
        mi.x[1][2]=b;
        mi.x[1][3]=c;
        mi.x[2][1]=mi.x[3][2]=1;
        mi.x[2][2]=mi.x[2][3]=mi.x[3][1]=mi.x[3][3]=0;

        mf=powmatrix3(mi,n-2);

        r=1LL*mf.x[1][1]*z%mod;
        while (r>mod)
            r-=mod;
        r+=1LL*mf.x[1][2]*y%mod;
        while (r>mod)
            r-=mod;
        r+=1LL*mf.x[1][3]*x%mod;
        while (r>mod)
            r-=mod;
        g<<r<<'\n';
    }

    g.close();
    return 0;
}