Cod sursa(job #2834160)

Utilizator Andrei_ierdnANeculau Rares-Andrei Andrei_ierdnA Data 16 ianuarie 2022 15:52:47
Problema Rsir Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.02 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], xp[7010], yp[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;
        bp[i] = b * i * i;
        xp[i] = x * i;
        yp[i] = y * i;
    }
    if (m >= 100)
    {
        i = 2;
        for (ep = m; ep < m * m + 3; ep += m) {
            for (i = i; i < ep; i++) {
                t2 = ap[t0] + bp[t1] + xp[t0] + yp[t1] + z;
                t2 = t2 % m;
                t0 = t1;
                t1 = t2;
            }
            t2 = ap[t0] + bp[t1] + xp[t0] + yp[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] + xp[t0] + yp[t1] + z;
            t2 = t2 % m;
            t0 = t1;
            t1 = t2;
        }
    }
    else {
        ep = m * m + 3;
        for (i = i; i <= ep; i++)
        {
            t2 = ap[t0] + bp[t1] + xp[t0] + yp[t1] + z;
            t2 = t2 % m;
            t0 = t1;
            t1 = t2;
        }
    }
    ct0 = t0;
    ct1 = t1;
    for (i = m * m + 4; !ok; i++)
    {
        t2 = ap[t0] + bp[t1] + xp[t0] + yp[t1] + z;
        t2 = t2 % m;
        t0 = t1;
        t1 = t2;
        if (t0 == ct0 && t1 == ct1)
        {
            clen = i - (m * m + 3);
            ok = 1;
        }
        if (m >= 100 && i % m == 0)
        {
            et0[i/m] = t0;
            et1[i/m] = t1;
        }
    }
    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] + xp[t0] + yp[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] + xp[t0] + yp[t1] + z;
            t2 = t2 % m;
            t0 = t1;
            t1 = t2;
        }
        g << t1;
    }
    f.close();
    g.close();
    return 0;
}