Cod sursa(job #3175653)

Utilizator unomMirel Costel unom Data 26 noiembrie 2023 11:40:29
Problema Rsir Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.36 kb
#include <fstream>

using namespace std;

ifstream in("rsir.in");
ofstream out("rsir.out");
int a, b, x, y, z, t0, t1, MOD, n;
int pre1[7005], pre2[7005];
int intarziere, perioada;

pair<int, int> urm(pair<int, int> p)
{
    pair<int, int> ans;

    ans.first = p.second;
    //ans.second = (pre1[p.first] + pre2[p.second]) % MOD;
    ans.second = pre1[p.first] + pre2[p.second] - (pre1[p.first] + pre2[p.second] >= MOD ? MOD : 0);

    return ans;
}

int main()
{
    in>>t0>>t1;
    in>>a>>b;
    in>>x>>y>>z;
    in>>MOD>>n;

    for(int i = 0; i<MOD; i++)
    {
        pre1[i] = (((a * i) % MOD * i) % MOD + (x * i) % MOD) % MOD;

        pre2[i] = (((b * i) % MOD * i) % MOD + (y * i) % MOD + z) % MOD;
    }

    pair<int, int> p1, p2;

    p1 = p2 = {t0, t1};

    do
    {
        p1 = urm(p1);
        p2 = urm(p2);
        p2 = urm(p2);
    }
    while(p1 != p2);


    p1 = {t0, t1};
    while(p1 != p2)
    {
        intarziere++;
        p1 = urm(p1);
        p2 = urm(p2);
    }


    p2 = urm(p2);
    perioada++;
    while(p1 != p2)
    {
        p2 = urm(p2);
        perioada++;
    }


    if(n > intarziere)
    {
        n = intarziere + (n - intarziere) % perioada;
    }

    p1 = {t0, t1};
    for(int i = 1; i<=n; i++)
    {
        p1 = urm(p1);
    }

    out<<p1.first;

    return 0;
}