Cod sursa(job #596309)

Utilizator crushackPopescu Silviu crushack Data 16 iunie 2011 19:01:58
Problema Rsir Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.4 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);

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

inline int makeNumber(int x,int y){
	return x + M*y;
}

inline int next(int p)
{
	int T1 = p/M ,  T0 = p-T1*M;
	int T2= A[T0] + B[T1] + z;
	while (T2>=M) T2-=M;
	return makeNumber(T1,T2);
}

int getCycle(int v)
{
	int 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()
{
	int c = getCycle(makeNumber(T0,T1)) , lcoada , lciclu , p;
	//printf("%d\n",c%M);
	
	for ( lcoada = 0 , p=makeNumber(T0,T1) ; 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=makeNumber(T0,T1) ; N-- ; p=next(p));
		Rez=p%M;
		return;
	}
	
	N%=lciclu;
	for ( p=c ; N-- ;)
		p=next(p);
	Rez=p%M;
}

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;
}