Cod sursa(job #2834142)

Utilizator Andrei_ierdnANeculau Rares-Andrei Andrei_ierdnA Data 16 ianuarie 2022 15:28:20
Problema Rsir Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.11 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;

int main()
{
    f >> st0 >> st1 >> a >> b >> x >> y >> z >> m >> n;
    st0 = st0 % m;
    st1 = st1 % m;
    t0 = st0;
    t1 = st1;
    for (i = 2; i <= m * m + 3; i++) {
        t2 = a * t0 * t0 + b * t1 * t1 + x * t0 + y * t1 + z;
        t2 = t2 % m;
        t0 = t1;
        t1 = t2;
        if (m >= 100 && i % m == 0) {
            et0[i/m] = t0;
            et1[i/m] = t1;
        }
    }
    ct0 = t0;
    ct1 = t1;
    for (i = m * m + 4; !ok; i++) {
        t2 = a * t0 * t0 + b * t1 * t1 + x * t0 + y * 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 = a * t0 * t0 + b * t1 * t1 + x * t0 + y * 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 = a * t0 * t0 + b * t1 * t1 + x * t0 + y * t1 + z;
            t2 = t2 % m;
            t0 = t1;
            t1 = t2;
        }
        g << t1;
    }
    f.close();
    g.close();
    return 0;
}