Cod sursa(job #1640367)

Utilizator bciobanuBogdan Ciobanu bciobanu Data 8 martie 2016 17:13:33
Problema Rsir Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.25 kb
#include <fstream>

using namespace std;

const int MAX_MOD = 7000;

pair <int, int> M[MAX_MOD];

int MOD;

inline
int W(const int &A) {
    return A - (MOD & -(A >= MOD));
}

inline
void F(pair <int, int> &curr) {
    curr = { curr.second, W(M[curr.first].first + M[curr.second].second) };
}

int main() {
    ifstream fin("rsir.in");
    ofstream fout("rsir.out");
    fin.tie(0);
    ios_base::sync_with_stdio(false);

    pair <int, int> T; int A, B, X, Y, Z; long long N; fin >> T.first >> T.second >> A >> B >> X >> Y >> Z >> MOD >> N;
    fin.close();

    T.first %= MOD; T.second %= MOD;

    for (int i = 0; i < MOD; ++ i) {
        M[i] = { (1LL * A * i * i + 1LL * X * i + Z) % MOD, (1LL * B * i * i + 1LL * Y * i) % MOD };
    }

    pair <int, int> tortoise, hare;
    int periodLength = 0;

    tortoise = T; hare = T;
    do {
        if (periodLength == N) {
            fout << tortoise.first << '\n';
            fout.close();
            return 0;
        }
        ++ periodLength;
        F(tortoise); F(hare); F(hare);

    } while (hare != tortoise);

    N %= periodLength;

    while (N--) {
        F(tortoise);
    }

    fout << tortoise.first << '\n';

    fout.close();

    return 0;
}