Cod sursa(job #526604)

Utilizator ooctavTuchila Octavian ooctav Data 28 ianuarie 2011 21:09:39
Problema Rsir Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.84 kb
#include<cstdio>
#include<cstdlib>
#include<ctime>
#include<iostream>
#include<algorithm>
#include<deque>
#include<queue>
#include<set>
#include<vector>
using namespace std;

const char IN[] = {"rsir.in"};
const char OUT[] = {"rsir.out"};
const int INF = 1000000005;
const int MMAX = 7005;

#define II inline
#define LL long long
#define PII pair<int, int>
#define fs first
#define ss second
#define mp make_pair
#define pb push_back
#define FOR(i, a, b) 	for(int i = a ; i <= b ; i++)
#define IFOR(i, a, b) 	for(int i = a ; i >= b ; i--)
#define FORIT(it, V) 	for(vector<int> :: iterator it = V.begin() ; it != V.end() ; it++)
//#define all(a) a, a + 

int a, b, x, y, z, t0, t1;
LL N;
int M;
int drum = -1, ciclu;
int pc1[MMAX], pc2[MMAX];

void citi()
{
	scanf("%d%d%d%d%d%d%d%d%lld", &t0, &t1, &a, &b, &x, &y, &z, &M, &N);
	t0 %= M;t1 %= M;
}

void precalcul()
{
	FOR(i, 1, M)
	{
		pc1[i] = (a * ((i * i) % M) + x * i)%M;
		pc2[i] = (b * ((i * i) % M) + y * i)%M;
	}
}

inline int mod(LL a, int b)
{
	LL x = (a - 1) % b + 1;
	return (int)x;
}

inline void avansa(PII &x)
{
	int aux = x.fs;
	x.fs = (pc1[x.ss] + pc2[x.fs] + z)%M;
	x.ss = aux;
}

void detect_ciclu()
{
	int i, j;
	PII a, b;
	a = mp(t1, t0);
	b = mp(t1, t0);
	for(i = 2, j = 2 ; ; i++, j++)
	{
		avansa(a);
		avansa(b);
		j++;
		avansa(b);
		if(a == b)	break;
	}
	ciclu = j - i;
	
	b = mp(t1, t0);
	if(a == b)	drum = 1;	
	if(drum == -1)
		for(drum = 2, i++; ; i++, drum++)
		{
			avansa(a);
			avansa(b);
			if(a == b)	break;
		}
	drum--;
	
	if(N > drum)
		N = mod(N - drum,ciclu) + drum;
}

void scrie()
{
	PII a = mp(t1, t0);
	FOR(i, 2, N)
		avansa(a);
	printf("%d\n", a.fs);
}

int main()
{
	freopen(IN, "r", stdin);
	freopen(OUT, "w", stdout);
	citi();
	precalcul();
	detect_ciclu();
	scrie();
	return 0;
}