Cod sursa(job #363149)

Utilizator ProtomanAndrei Purice Protoman Data 11 noiembrie 2009 22:29:17
Problema Rsir Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.13 kb
#include <algorithm>
#include <stdio.h>

#define MAX 7010
#define ll long long

using namespace std;

ll st1, st2, t0, t1, t, a, b, x, y, z, m, n, lung;
ll urm1[MAX], urm2[MAX];

int main()
{
	freopen("rsir.in", "r", stdin);
	freopen("rsir.out", "w", stdout);

	scanf("%lld %lld %lld %lld %lld %lld %lld %lld %lld", &t0, &t1, &a, &b, &x, &y, &z, &m, &n);
	t0 %= m;
	t1 %= m;
	z %= m;

	for (int i = 0; i < m; i++)
	{
		urm1[i] = (a * (i * i) % m + x * i) % m;
		urm2[i] = (b * (i * i) % m + y * i) % m;
	}

	for (int i = 0; i < m * m; i++)
	{
		for (t = urm1[t0] + urm2[t1] + z; t >= m; t -= m);

		t0 = t1, t1 = t;

		if (i + 2 == n)
		{
			printf("%lld\n", t1);
			
			return 0;
		}
	}

	n -= (ll) m * m;

	for (st1 = t0, st2 = t1, lung = 1; ; lung++)
	{
		for (t = urm1[t0] + urm2[t1] + z; t >= m; t -= m);

		t0 = t1, t1 = t;

		if (st1 == t0 && st2 == t1)
			break;
	}

	int i = 0;
	for (st1 = t0, st2 = t1; ; i++)
	{
		if (n % lung == i)
		{
			printf("%lld\n", t0);

			return 0;
		}

		for (t = urm1[t0] + urm2[t1] + z; t >= m; t -= m);

		t0 = t1, t1 = t;
	}

	return 0;
}