Cod sursa(job #1136913)

Utilizator Daniel3717Aleca Daniel Adrian Daniel3717 Data 9 martie 2014 11:30:02
Problema Iepuri Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.82 kb
#include <iostream>
#include <fstream>
using namespace std;

#define mod 666013

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

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

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++)
            {
                r.x[l][c]+=m1.x[l][i]*m2.x[i][c];
                r.x[l][c]%=mod;
            }
    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;

    for (l=0;l<=3;l++)
        for (c=0;c<=3;c++)
            rm.x[l][c]%=mod;

    rm=rm*axm;

    for (l=0;l<=3;l++)
        for (c=0;c<=3;c++)
            rm.x[l][c]%=mod;

    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=mf.x[1][1]*z;
        r%=mod;
        r+=mf.x[1][2]*y;
        r%=mod;
        r+=mf.x[1][3]*x;
        r%=mod;
        g<<r<<'\n';
    }

    g.close();
    return 0;
}