Cod sursa(job #912469)

Utilizator apopeid13Apopeid Alejandro apopeid13 Data 12 martie 2013 14:19:15
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.45 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;
        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;
}