Cod sursa(job #993564)

Utilizator alexalghisiAlghisi Alessandro Paolo alexalghisi Data 4 septembrie 2013 01:37:28
Problema Iepuri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.72 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]+=rez[i][p]*init[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";
        if(n<=2)
           continue;
        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;
}