Cod sursa(job #908445)

Utilizator AndreiTeodorAndrei R AndreiTeodor Data 9 martie 2013 14:04:33
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.48 kb
#include <fstream>
using namespace std;

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

long long q[4][4];
long long mod = 666013;

void Inmultire(long long a[4][4],long long b[4][4])
{
    long long c[4][4],i,j;

    for(i=0;i<=2;i++)
    {
        c[i][0] = a[i][0]*b[0][0] + a[i][1]*b[1][0] + a[i][2]*b[2][0];
        c[i][1] = a[i][0]*b[0][1] + a[i][1]*b[1][1] + a[i][2]*b[2][1];
        c[i][2] = a[i][0]*b[0][2] + a[i][1]*b[1][2] + a[i][2]*b[2][2];
    }

    for(i=0;i<=2;i++)
        for(j=0;j<=2;j++)
            {
                if(c[i][j]>mod)
                    c[i][j] %= mod;
                b[i][j]=c[i][j];
            }
}

void Solve(long long k)
{
    int i,j;
    long long w[4][4];

    if(k>1)
        if(k%2==0)
        {
            Inmultire(q,q);
            Solve(k/2);
        }
        else
        {
            for(i=0;i<=2;i++)
                for(j=0;j<=2;j++)
                    w[i][j] = q[i][j];
            Inmultire(q,q);
            Solve((k-1)/2);
            Inmultire(w,q);
        }
}

int main()
{
    long long num_tests,a,b,c,x,y,z,n;

    f>>num_tests;
    while(num_tests--)
    {
        f>>x>>y>>z>>a>>b>>c>>n;

        //Initialize Matrix
        q[0][0] = 0, q[0][1] = 1, q[0][2] = 0;
        q[1][0] = 0, q[1][1] = 0, q[1][2] = 1;
        q[2][0] = c, q[2][1] = b, q[2][2] = a;

        Solve(n-2);
        g<<(x*q[2][0] + y*q[2][1] + z*q[2][2])%mod<<'\n';
    }

    return 0;
}