Cod sursa(job #71328)

Utilizator dominoMircea Pasoi domino Data 10 iulie 2007 09:30:49
Problema Rsir Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.45 kb
#include <stdio.h>
#include <algorithm>

using namespace std;

#define MAX_M 7005
#define FIN "rsir.in"
#define FOUT "rsir.out"
#define f first
#define s second
#define mp make_pair

typedef pair<int, int> entry;

int T0, T1, A, B, X, Y, Z, M, V1[MAX_M], V2[MAX_M];
long long N;

inline entry next(entry e)
{
    int t = V1[e.f]+V2[e.s];

    if (t >= M) t-= M;
    return mp(e.s, t);
}

int main(void)
{
    int i, len, n;
    entry e1, e2;

    freopen(FIN, "r", stdin);
    freopen(FOUT, "w", stdout);

    scanf("%d %d %d %d %d %d %d %d %lld", &T0, &T1, &A, &B, &X, &Y, &Z, &M, &N);
    A %= M; B %= M; X %= M; Y %= M; Z %= M;

    for (i = 0; i < M; ++i)
    {
        V1[i] = ((i*i)%M*A + X*i)%M;
        V2[i] = ((i*i)%M*B + Y*i+Z)%M;
    }

    if (N == 0) { printf("%d\n", T0%M); return 0; }
    if (N == 1) { printf("%d\n", T1%M); return 0; }

    e1 = e2 = mp(T0%M, T1%M);
    for (n = 2; n <= N; ++n)
    {
        e1 = next(e1);
        if (n == N)
        {
            printf("%d\n", e1.s);
            return 0;
        }
        e2 = next(next(e2));
        if (e1 == e2) break;
    }

    for (e2 = next(e1), len = 1; e2 != e1; e2 = next(e2)) ++len;
    
    e1 = e2 = mp(T0%M, T1%M);
    for (i = 0; i < len; ++i) e2 = next(e2);
    for (n = 1; e1 != e2; e1 = next(e1), e2 = next(e2), n++);

    N -= n; N %= len;
    for (i = 0; i < N; ++i) e1 = next(e1);
    printf("%d\n", e1.s);

    return 0;
}