Cod sursa(job #2266690)

Utilizator alexnigaNiga Alexandru alexniga Data 22 octombrie 2018 20:36:22
Problema Al k-lea termen Fibonacci Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.75 kb
#include    <iostream>
#include    <fstream>

using namespace std;

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

const int MOD = 666013;

struct matrice
{
    long long a00,a01,a02,a10,a11,a12,a20,a21,a22;
};
matrice A;
void creareA(long long a, long long b, long long c)
{


    A.a00 = 0; A.a01 = 1; A.a02 = 0;
    A.a10 = 0; A.a11 = 0; A.a12 = 1;
    A.a20 = c; A.a21 = b; A.a22 = a;

}

matrice inmulteste( matrice A, matrice B)
{
    matrice C;

    C.a00 = (A.a00 * B.a00 + A.a01* B.a10+ A.a02 * B.a20) % MOD;
    C.a01 = (A.a00 * B.a01 + A.a01* B.a11+ A.a02 * B.a21) % MOD;
    C.a02 = (A.a00 * B.a02 + A.a01* B.a12+ A.a02 * B.a22) % MOD;
    C.a10 = (A.a10 * B.a00 + A.a11* B.a10+ A.a12 * B.a20) % MOD;
    C.a11 = (A.a10 * B.a01 + A.a11* B.a11+ A.a12 * B.a21) % MOD;
    C.a12 = (A.a10 * B.a02 + A.a11* B.a12+ A.a12 * B.a22) % MOD;
    C.a20 = (A.a20 * B.a00 + A.a21* B.a10+ A.a22 * B.a20) % MOD;
    C.a21 = (A.a20 * B.a01 + A.a21* B.a11+ A.a22 * B.a21) % MOD;
    C.a22 = (A.a20 * B.a02 + A.a21* B.a12+ A.a22 * B.a22) % MOD;

    return C;


}

matrice putere(matrice M, long long k)
{
    matrice I;
    I.a00 = 1; I.a01 = 0; I.a02 = 0;
    I.a10 = 0; I.a11 = 1; I.a12 = 0;
    I.a20 = 0; I.a21 = 0; I.a22 = 1;

    while(k!=0)
    {
        if(k%2==1)
        {
            I = inmulteste(I, M);
        }

        M = inmulteste(M, M);
        k/=2;
    }

    return I;
}

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

    f >> T;

    while (T)
    {

        f >> x >> y >> z >> a >> b >> c >> n;

        creareA(a, b, c);
        A = putere(A, n-2);

        g << ((A.a20 * x) % MOD + (A.a21 * y) % MOD + (A.a22 * z) % MOD) % MOD << "\n";


        T--;
    }

    return 0;
}