Cod sursa(job #600292)

Utilizator SpiderManSimoiu Robert SpiderMan Data 1 iulie 2011 10:42:16
Problema Rsir Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.14 kb
# include <algorithm>
# include <cstdio>
using namespace std;

# define x first
# define y second

typedef long long ll;
typedef pair <int, int> PR;
const char *FIN = "rsir.in", *FOU = "rsir.out";
const int MAX = 7005;

ll N;
PR T;
int A, B, X, Y, Z, M, sol, ind = 1;
int P[2][MAX];

inline int _mod (ll A) {
    if (A >= M) A -= M;
    if (A >= M) A %= M;
    return A;
}

PR doit (PR T) {
    return make_pair (T.y, _mod (P[0][T.x] + P[1][T.y]));
}

int main (void) {
    fscanf (fopen (FIN, "r"), "%d %d %d %d %d %d %d %d %lld", &T.x, &T.y, &A, &B, &X, &Y, &Z, &M, &N);
    for (int i = 0; i < M; ++i) {
        P[0][i] = _mod (1LL * i * i * A + 1LL * i * X);
        P[1][i] = _mod (1LL * i * i * B + 1LL * i * Y + 1LL * Z);
    }
    T.x = _mod (T.x), T.y = _mod (T.y);
    for (PR t = doit (doit (T)); N + 1 && T != t; T = doit (T), t = doit (doit (t)), --N)
        if (N == 0) sol = T.x;
    if (N + 1)
        for (PR t = doit (T); T != t; t = doit (t), ++ind);
    if (N > 0) {
        for (N %= ind; N + 1; T = doit (T), --N)
            if (N == 0) sol = T.x;
    }
    fprintf (fopen (FOU, "w"), "%d", sol);
}