Cod sursa(job #180929)

Utilizator gabitzish1Gabriel Bitis gabitzish1 Data 17 aprilie 2008 17:43:15
Problema Rsir Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.09 kb
#include <cstdio>
#include <vector>

#define f first
#define s second
#define mp make_pair<int,int>
#define pr pair<int,int>

using namespace std;

int t0, t1, m, x, y, z, a, b, A[7001], B[7001], k, i, j, l;
long long n;

pr ti, tj;
pr f(pr t)
{
	k = A[t.f] + B[t.s];
	if(k >= m) k -= m;
	return mp(t.s, k);
}

int main()
{
	freopen("rsir.in","r",stdin);
	freopen("rsir.out","w",stdout);
	scanf("%d %d %d %d %d %d %d %d %lld",&t0, &t1, &a, &b, &x, &y, &z, &m, &n);
	t0 %= m; t1 %= m; a %= m; b %= m;
	x %= m;y %= m;z %= m;

	ti.f = t0;
	ti.s = t1;
	for(i = 0; i < m; i++)
	{
		k = (i * i) % m;
		A[i] = (k * a + i * x) % m;
		B[i] = (k * b + i * y + z) % m;
	}

	tj = f(ti);
	if(!n) 
	{
		printf("%d\n", t0);
		return 0;
	}

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

	for(l = 1, --n; n > 1 && ti != tj; ti = f(ti), tj = f(f(tj)),n = n - 2, ++l);
	if(!n)
	{
		printf("%d\n",tj.f);
		return 0;
	}

	if(n == 1)
	{
		printf("%d\n",tj.s);
		return 0;
	}
	n %= l;

	while(n)
	{
		ti = f(ti);
		n--;
	}
	printf("%d\n", ti.f);
	return 0;
}