Cod sursa(job #993285)

Utilizator alexalghisiAlghisi Alessandro Paolo alexalghisi Data 3 septembrie 2013 16:27:33
Problema Iepuri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.76 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <cstring>

#define MOD 666013
using namespace std;

long long x,y,z,a,b,c,n;
long long rez[5][5],init[5][5],tmp[5][5];


void pow(long long putere)
{
    if(putere == 0 || putere == 1)
        return;

    if(putere%2==0)
    {
        /// rez * rez
        for(int i=1;i<=3;++i)
            for(int j=1;j<=3;++j)
            {
                tmp[i][j]=0;
                for(int p=1;p<=3;++p)
                    tmp[i][j]+=rez[i][p]*rez[p][j];

                tmp[i][j]%=MOD;
            }
         for(int i=1;i<=3;++i)
            for(int j=1;j<=3;++j)
                rez[i][j]=tmp[i][j];

        pow(putere/2);
        return;
    }

    pow(putere-1);

    /// rez * init
    for(int i=1;i<=3;++i)
        for(int j=1;j<=3;++j)
        {
            tmp[i][j]=0;
            for(int p=1;p<=3;++p)
                tmp[i][j]+=init[i][p]*rez[p][j];
            tmp[i][j]%=MOD;
        }

    for(int i=1;i<=3;++i)
        for(int j=1;j<=3;++j)
            rez[i][j]=tmp[i][j];


}

int main()
{
    int t;
    ifstream f("iepuri.in");
    ofstream g("iepuri.out");
    f>>t;
    for(;t;--t)
    {
        f>>x>>y>>z>>a>>b>>c>>n;
        if( n == 0 )
            g<<x<<"\n";
        if( n == 1 )
            g<<y<<"\n";
        if(n == 2 )
            g<<z<<"\n";

        memset(rez,0,sizeof(rez));
        memset(init,0,sizeof(init));
        rez[1][3]=c; init[1][3]=c;
        rez[2][1]=1; init[2][1]=1;
        rez[2][3]=b; init[2][3]=b;
        rez[3][2]=1; init[3][2]=1;
        rez[3][3]=a; init[3][3]=a;


        pow(n-2);
        long long r=(x*rez[1][3] + y*rez[2][3] + z*rez[3][3]);
        g<<r%MOD<<endl;
    }
    return 0;
}