Cod sursa(job #735642)

Utilizator HulkIncredibilul Hulk Hulk Data 16 aprilie 2012 21:59:36
Problema Rsir Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.26 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;
int prep[2][7005],val;
pi val1,val2;

inline int calc(int v1,int v2)
{
	val = prep[0][v1] + prep[1][v2];	
	if(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 + z) % MOD; 
		prep[1][i] = (((i * i) % MOD) * b + i * y) % MOD; 
	}	
	
	ind1 = 1;
	val1 = mp(t0 % MOD,t1 % MOD);	
	val2 = mp(t0 % MOD,t1 % MOD);
	
	if(n <= 6000 * 6000)
	{
		for(i = 2; i <= n; i++)
			val1 = Next(val1);
		printf("%d\n",val1.y);	
		return 0;
	}
	for(; ;)
	{
		ind1++;
		val1 = Next(val1);
		val2 = Next(Next(val2));
		if(val1 == val2)
			break;
	}		
	i = ind1 - 1;
	n = (n - ind1) % i;
	for(val2 = val1; n; n-=2, val2 = Next(Next(val2)))
	{
		if(n == 1)
		{
			val2 = Next(val2);
			break;
		}	
	}
	
	printf("%d\n",val2.y);
	
	return 0;
}