Cod sursa(job #71320)
#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]+Z;
while (t >= M) t-= M;
return mp(e.s, t);
}
int main(void)
{
int i, n, len;
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);
for (i = 0; i < M; ++i)
{
V1[i] = (A*i*i + X*i)%M;
V2[i] = (B*i*i + Y*i)%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 = 0; 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;
}