Cod sursa(job #993962)

Utilizator alexalghisiAlghisi Alessandro Paolo alexalghisi Data 4 septembrie 2013 19:38:54
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.92 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],aux[5][5],tmp[5][5];

void pow(long long p)
{
    /// x


    for(;p;p>>=1)
    {
        if(p&1) /// rez*=aux
        {
            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]*aux[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];
        }

        /// aux * = aux
        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]+=aux[i][p]*aux[p][j];
                tmp[i][j]%=MOD;
            }
        for(int i=1;i<=3;++i)
            for(int j=1;j<=3;++j)
                aux[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";
        if(n<=2)
           continue;
        memset(rez,0,sizeof(rez));
        memset(aux,0,sizeof(aux));
        rez[1][3]=c; aux[1][3]=c;
        rez[2][1]=1; aux[2][1]=1;
        rez[2][3]=b; aux[2][3]=b;
        rez[3][2]=1; aux[3][2]=1;
        rez[3][3]=a; aux[3][3]=a;

        pow(n-2);
        /*for(int i=1;i<=3;++i,cout<<endl)
            for(int j=1;j<=3;++j)
                cout<<rez[i][j]<<" ";
        cout<<endl;*/
        long long r=(x*rez[1][2] + y*rez[2][2] + z*rez[3][2]);
        g<<r%MOD<<"\n";
    }
    return 0;
}