Cod sursa(job #596310)

Utilizator crushackPopescu Silviu crushack Data 16 iunie 2011 19:12:26
Problema Rsir Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.45 kb
#include <fstream>
#define MMax 7010
using namespace std;
typedef long long ll;

const char IN[]="rsir.in",OUT[]="rsir.out";

ifstream fin(IN); 
ofstream fout(OUT);

struct poz{
	int x,y;
	bool operator!=(poz const &b) const{
		return x!=b.x || y!=b.y;
	}
};

int T0,T1,a,b,x,y,z,M;
int A[MMax],B[MMax];
int Rez;
ll N;

inline poz next(poz p)
{
	static poz ret;
	int T1 = p.y ,  T0 = p.x;
	int T2= A[T0] + B[T1] + z;
	while (T2>=M) T2-=M;
	ret.x=T1;ret.y=T2;
	return ret;
}

poz getCycle(poz v)
{
	poz p1,p2;
	
	p1 = p2 = v;
	p1=next(p1),p2=next(next(p2));
	for (; p1!=p2 ;)
		p1=next(p1),p2=next(next(p2));
	for ( p1 = v ; p1!=p2 ; p1=next(p1) , p2 = next(p2) );
	
	return p1;
}

void solve()
{
	poz p,pz={T0,T1};
	poz c = getCycle(pz) ;
    int lcoada , lciclu ;
	//printf("%d\n",c%M);
	
	for ( lcoada = 0 , p=pz ; p!=c ; p=next(p) , ++lcoada);
	for ( lciclu = 1 , p=next(c) ; p!=c ; ++lciclu)
		p=next(p);
	
	if ( N > lcoada ) N-=lcoada;
	else
	{
		--N;
		for ( p=pz ; N-- ; p=next(p));
		Rez=p.x;
		return;
	}
	
	N%=lciclu;
	for ( p=c ; N-- ;)
		p=next(p);
	Rez=p.x;
}

inline void init()
{
	int i;
	
	T0%=M;T1%=M;
	for (i=0;i<M;++i)
		A[i]= (1LL * a * i * i + 1LL * x * i) % M;
	
	for (i=0;i<M;++i)
		B[i]= (1LL * b * i * i + 1ll * y * i) % M;
}

int main()
{
	fin>>T0>>T1>>a>>b>>x>>y>>z>>M>>N;
	fin.close();
	
	init();
	solve();
	
	fout<<Rez<<"\n";
	fout.close();
	
	return 0;
}