Cod sursa(job #2834164)

Utilizator Andrei_ierdnANeculau Rares-Andrei Andrei_ierdnA Data 16 ianuarie 2022 16:03:23
Problema Rsir Scor 40
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.71 kb
#include <fstream>

using namespace std;

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

long long st0, st1, t0, t1, t2, a, b, x, y, z, m, n, ct0, ct1, ok, clen, poz, i;
long long et0[14100], et1[14100], sp, ep;
long long ap[7010], bp[7010];

int main()
{
    f >> st0 >> st1 >> a >> b >> x >> y >> z >> m >> n;
    st0 = st0 % m;
    st1 = st1 % m;
    t0 = st0;
    t1 = st1;
    for (i = 1; i <= m; i++)
    {
        ap[i] = a * i * i + x * i;
        bp[i] = b * i * i + y * i;
    }
    if (m >= 100)
    {
        i = 2;
        for (ep = m; ep <= m * m; ep += m)
        {
            for (i = i; i < ep; i++)
            {
                t2 = ap[t0] + bp[t1] + z;
                t2 = t2 % m;
                t0 = t1;
                t1 = t2;
            }
            t2 = ap[t0] + bp[t1] + z;
            t2 = t2 % m;
            t0 = t1;
            t1 = t2;
            et0[i/m] = t0;
            et1[i/m] = t1;
            i++;
        }
        ep = m * m + 3;
        for (i = i; i <= ep; i++)
        {
            t2 = ap[t0] + bp[t1] + z;
            t2 = t2 % m;
            t0 = t1;
            t1 = t2;
        }
    }
    else
    {
        i = 2;
        ep = m * m + 3;
        for (i = i; i <= ep; i++)
        {
            t2 = ap[t0] + bp[t1] + z;
            t2 = t2 % m;
            t0 = t1;
            t1 = t2;
        }
    }
    ct0 = t0;
    ct1 = t1;
    if (m >= 100)
    {
        i = m * m + 4;
        for (ep = m * m + m; !ok; ep += m)
        {
            for (i = i; i < ep; i++)
            {
                t2 = ap[t0] + bp[t1] + z;
                t2 = t2 % m;
                t0 = t1;
                t1 = t2;
                if (t0 == ct0 && t1 == ct1)
                {
                    clen = i - (m * m + 3);
                    ok = 1;
                    i = ep + 1;
                }
            }
            if (i < ep + 2) {
                t2 = ap[t0] + bp[t1] + z;
                t2 = t2 % m;
                t0 = t1;
                t1 = t2;
                if (t0 == ct0 && t1 == ct1)
                {
                    clen = i - (m * m + 3);
                    ok = 1;
                }
                et0[i/m] = t0;
                et1[i/m] = t1;
            }
        }
    }
    else {
        for (i = m * m + 4; !ok; i++)
        {
            t2 = ap[t0] + bp[t1] + z;
            t2 = t2 % m;
            t0 = t1;
            t1 = t2;
            if (t0 == ct0 && t1 == ct1)
            {
                clen = i - (m * m + 3);
                ok = 1;
            }
        }
    }
    if (n == 0)
        g << st0;
    else if (n == 1)
        g << st1;
    else if (n <= m * m + 3)
    {
        if (m >= 100 && n >= m)
        {
            t0 = et0[n/m];
            t1 = et1[n/m];
            sp = (n / m) * m + 1;
        }
        else
        {
            t0 = st0;
            t1 = st1;
            sp = 2;
        }
        for (i = sp; i <= n; i++)
        {
            t2 = ap[t0] + bp[t1] + z;
            t2 = t2 % m;
            t0 = t1;
            t1 = t2;
        }
        g << t1;
    }
    else
    {
        poz = (n - (m * m + 3)) % clen + (m * m + 3);
        if (m >= 100)
        {
            t0 = et0[poz/m];
            t1 = et1[poz/m];
            sp = (poz / m) * m + 1;
        }
        else
        {
            t0 = ct0;
            t1 = ct1;
            sp = m * m + 4;
        }
        for (i = sp; i <= poz; i++)
        {
            t2 = ap[t0] + bp[t1] + z;
            t2 = t2 % m;
            t0 = t1;
            t1 = t2;
        }
        g << t1;
    }
    f.close();
    g.close();
    return 0;
}