Cod sursa(job #526155)

Utilizator indestructiblecont de teste indestructible Data 27 ianuarie 2011 16:04:35
Problema Rsir Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.62 kb
#include <stdio.h>
#define NMAX 7005
#define ll long long
int t0,t1,a,b,x,y,z,m;
ll n,ind1,ind2;
int h,g,A[NMAX],B[NMAX],C[NMAX],D[NMAX];
int t2,t3,steps;
void precompute()
{
	int i;
	for (i=0; i<m; i++)
	{
		A[i]=(((i*i)%m)*a)%m;
		B[i]=(((i*i)%m)*b)%m;
		C[i]=(i*x)%m;
		D[i]=(i*y)%m;
	}
}
inline int next_val(int v1,int v2)
{
	int act=0;
	act=A[v1]+B[v2];
	if (act>=m) act-=m;
	act+=C[v1];
	if (act>=m) act-=m;
	act+=D[v2];
	if (act>=m) act-=m;
	act+=z;
	if (act>=m) act-=m;
	return act;
}
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;
	h=t0; g=t1;
	precompute();
	int i,val;
	ind1=ind2=1;
	t2=t0; t3=t1;
	while (1)
	{
		ind1++;
		val=next_val(t0,t1);
		t0=t1; t1=val; 
		if (ind1==n)
		{
			printf("%d\n",val);
			return 0;
		}
		
		ind2+=2;
		val=next_val(t2,t3);
		t2=t3; t3=val;
		val=next_val(t2,t3);
		t2=t3; t3=val;
		
		if (t0==t2 && t1==t3)
		{
			while (1)//lungimea cliclului
			{
				val=next_val(t2,t3);
				t2=t3; t3=val;
				steps++;
				if (t2==t0 && t3==t1)
					break ;
			}
			
			ind2=1;
			t2=h; t3=g;
			while (1)
			{
				ind1++; ind2++;
				val=next_val(t0,t1);
				t0=t1; t1=val;
				val=next_val(t2,t3);
				t2=t3; t3=val;
				if (t0==t2 && t3==t1) //de la ind2 incepe ciclul 
				{
					n-=ind2-1;//scad ce nu face parte din ciclu
					n%=steps;
					if (n==0) n+=steps;
					for (i=1; i<=n; i++)
					{
						val=next_val(t0,t1);
						t0=t1; t1=val;
						printf("%d\n",val);
					}
				}
			}
			break ;
		}
	}
	return 0;
}