Cod sursa(job #735346)

Utilizator HulkIncredibilul Hulk Hulk Data 16 aprilie 2012 10:59:29
Problema Rsir Scor 60
Compilator cpp Status done
Runda lot_3 Marime 1.39 kb
#include<stdio.h>
#include<set>
using namespace std;

#define pi pair<int,int>
#define x first
#define y second
#define mp make_pair
#define ll long long

ll n;
int t0,t1,a,b,x,y,z,MOD,ind1,ind2;
int prep[2][7005];
pi val1,val2;

inline int calc(int v1,int v2)
{
	if(v1 >= MOD)
		v1 %= MOD;
	if(v2 >= MOD)	
		v2 %= MOD;
	int val = prep[0][v1] + prep[1][v2] + z;	
	while(val >= MOD)
		val -= MOD;
	return val;	
}

inline pi Next(pi val)
{
	return mp(val.y, calc(val.x,val.y));
}

int main ()
{
	int i;
	
	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,&MOD,&n);
	if(!n)
	{
		printf("%d\n",t0);
		return 0;
	}
	if(n == 1)
	{
		printf("%d\n",t1);
		return 0;
	}
	for(i = 0; i < MOD; i++)
	{
		prep[0][i] = (((i * i) % MOD) * a + i * x) % MOD; 
		prep[1][i] = (((i * i) % MOD) * b + i * y) % MOD; 
	}	
	
	ind1 = ind2 = 1;
	val1 = mp(t0,t1);	
	val2 = mp(t0,t1);
			
	for(; ;)
	{
		ind1++;
		val1 = Next(val1);
		ind2 += 2;
		val2 = Next(Next(val2));
		
		//printf("cel de al %d-lea este %d %d\niar cel de al %d-lea este %d %d\n\n",ind1,val1.x,val1.y,ind2,val2.x,val2.y);
		if(ind1 == n)
		{
			printf("%d\n",val1.y);
			return 0;
		}
		
		if(val1 == val2)
			break;
	}		
	
	for(i = 1, val2 = Next(val1); val2 != val1; i++, val2 = Next(val2));
	
	n = (n - ind1) % i;
	 
	for(val2 = val1; n; n--, val2 = Next(val2));
	
	printf("%d\n",val2.y);
	
	return 0;
}