Cod sursa(job #360542)

Utilizator rupraRupra C rupra Data 31 octombrie 2009 20:01:03
Problema Rsir Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.06 kb
#include <algorithm>
#include <stdio.h>

#define MAX 7010
#define ll long long

using namespace std;

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

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

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

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

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

		t0 = t1, t1 = t;

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

	n -= m * m;

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

		t0 = t1, t1 = t;
	}

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

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

		t0 = t1, t1 = t;
	}

	fclose(stdin);
	fclose(stdout);
	return 0;
}