Cod sursa(job #2071057)

Utilizator HD650Stoicescu Adrian Nicolae HD650 Data 20 noiembrie 2017 10:13:59
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.57 kb
#include <iostream>
#include <fstream>
using namespace std;
const int mod = 666013;
ifstream f("iepuri.in");
ofstream g("iepuri.out");
int x, y, z, a, b, c, n;
void inmm(long long m[][3])
{
    long long t[3][3];
    for(int i = 0; i < 3; i++)
        for(int j = 0; j < 3; j++)
            for(int k = 0; k < 3; k++)
            {
                t[i][j] = 0;
                for(int k = 0; k < 3; k++)
                    t[i][j] += m[i][k] * m[k][j] % mod;
            }
    for(int i = 0; i < 3; i++)
        for(int j = 0; j < 3; j++)
            m[i][j] = t[i][j];
}

void inmp(long long m[][3], long long p[][3])
{
    long long t[3][3];
    for(int i = 0; i < 3; i++)
        for(int j = 0; j < 3; j++)
        {
            t[i][j] = 0;
            for(int k = 0; k < 3; k++)
                t[i][j] += m[i][k] * p[k][j] % mod;
        }
    for(int i = 0; i < 3; i++)
        for(int j = 0; j < 3; j++)
            p[i][j] = t[i][j];
}

long long iep(int n)
{
    long long m[3][3] = {{0, 0, c}, {1, 0, b}, {0, 1, a}};
    long long p[3][3] = {{1, 0, 0}, {0, 1, 0}, {0, 0, 1}};
    while(n > 0)
    {
        if(n % 2 == 0)
        {
            n /= 2;
            inmm(m);///m*=m;
        }
        else
        {
            n--;
            inmp(m, p); ///p *= m;
        }
    }
    return (x * p[0][2] + y * p[1][2] + z * p[2][2]) % mod;
}
int main()
{
    int nn;
    f >> nn;
    for(int mm = 1; mm <= nn; mm++)
    {
        f >> x >> y >> z >> a >> b >> c >> n;
        g << iep(n - 2) << '\n';
    }
    return 0;
}