Cod sursa(job #1652934)

Utilizator andreib888Balan Andrei andreib888 Data 15 martie 2016 16:49:27
Problema Iepuri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.58 kb
#include <iostream>
#include <fstream>
#define MOD 666013
using namespace std;

ifstream f("iepuri.in");
ofstream g("iepuri.out");

void pow(long long n,long long &m11,long long &m12,long long &m13,long long &m21,long long &m22,long long &m23,
         long long &m31,long long &m32,long long &m33)
{
    if(!n%2)
    {
        long long p11=m11,p12=m12,p13=m13,p21=m21,p22=m22,p23=m23,p31=m31,p32=m32,p33=m33;
        pow(n/2,p11,p12,p13,p21,p22,p23,p31,p32,p33);
        m11=((p11*p11)%MOD+(p12*p21)%MOD+(p13*p31)%MOD)%MOD;
        m12=((p11*p12)%MOD+(p12*p22)%MOD+(p13*p32)%MOD)%MOD;
        m13=((p11*p13)%MOD+(p12*p23)%MOD+(p13*p33)%MOD)%MOD;
        m21=((p21*p11)%MOD+(p22*p21)%MOD+(p23*p31)%MOD)%MOD;
        m22=((p21*p12)%MOD+(p22*p22)%MOD+(p23*p32)%MOD)%MOD;
        m23=((p21*p13)%MOD+(p22*p23)%MOD+(p23*p33)%MOD)%MOD;
        m31=((p31*p11)%MOD+(p32*p21)%MOD+(p33*p31)%MOD)%MOD;
        m32=((p31*p12)%MOD+(p32*p22)%MOD+(p33*p32)%MOD)%MOD;
        m33=((p31*p13)%MOD+(p32*p23)%MOD+(p33*p33)%MOD)%MOD;
    }
    else if(n!=1)
        {
            long long p11=m11,p12=m12,p13=m13,p21=m21,p22=m22,p23=m23,p31=m31,p32=m32,p33=m33;
            long long w11,w12,w13,w21,w22,w23,w31,w32,w33;
            pow(n-1,p11,p12,p13,p21,p22,p23,p31,p32,p33);
            w11=((m11*p11)%MOD+(m12*p21)%MOD+(m13*p31)%MOD)%MOD;
            w12=((m11*p12)%MOD+(m12*p22)%MOD+(m13*p32)%MOD)%MOD;
            w13=((m11*p13)%MOD+(m12*p23)%MOD+(m13*p33)%MOD)%MOD;
            w21=((m21*p11)%MOD+(m22*p21)%MOD+(m23*p31)%MOD)%MOD;
            w22=((m21*p12)%MOD+(m22*p22)%MOD+(m23*p32)%MOD)%MOD;
            w23=((m21*p13)%MOD+(m22*p23)%MOD+(m23*p33)%MOD)%MOD;
            w31=((m31*p11)%MOD+(m32*p21)%MOD+(m33*p31)%MOD)%MOD;
            w32=((m31*p12)%MOD+(m32*p22)%MOD+(m33*p32)%MOD)%MOD;
            w33=((m31*p13)%MOD+(m32*p23)%MOD+(m33*p33)%MOD)%MOD
            ;
            m11=w11,m12=w12,m13=w13,m21=w21,m22=w22,m23=w23,m31=w31,m32=w32,m33=w33;
        }
}

void citire()
{
    long long t, x, y, z, a, b, c, n;
    long long m11,m12,m13,m21,m22,m23,m31,m32,m33;
    f>>t;
    if(t)
    {
        for(;t;t--)
        {
            f>>x>>y>>z>>a>>b>>c>>n; n++;
            if(n==1) g<<x<<"\n";
            if(n==2) g<<y<<"\n";
            if(n==3) g<<z<<"\n";
            if(n>3)
            {
                m11=0,m12=0,m13=c,m21=1,m22=0,m23=b,m31=0,m32=1,m33=a;
                pow(n-3,m11,m12,m13,m21,m22,m23,m31,m32,m33);
                g<<((x*m13)%MOD+(y*m23)%MOD+(z*m33)%MOD)%MOD<<"\n";
            }
        }
    }
}

int main()
{
    citire();
    return 0;
}