Cod sursa(job #735654)

Utilizator HulkIncredibilul Hulk Hulk Data 16 aprilie 2012 22:16:46
Problema Rsir Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.14 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 pi Next(pi per)
{
	val = prep[0][per.x] + prep[1][per.y];
	if(val >= MOD)
		val -= MOD;
	return mp(per.y, val);
}

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 <= 1000 * 1000)
	{
		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--, val2 = Next(val2));
	
	printf("%d\n",val2.y);
	
	return 0;
}