Cod sursa(job #736133)

Utilizator BarracudaFMI-Alex Dobrin Barracuda Data 17 aprilie 2012 22:24:46
Problema Rsir Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.18 kb
#include<fstream>
#define dim 7200
using namespace std;

ifstream f("rsir.in");
ofstream g("rsir.out");

typedef pair<int,int>cic;
int A[dim],B[dim];
int t0,t1,x,y,z,a,b,p1,p2,rr,inceput,i,lungime,n,M;
void precalcul () {
	long mod=M;
	for(int i=0;i<M;i++) {
		
		A[i]=((((i*i)%mod)*a)%mod +(x*i)%mod)%mod;
		
		B[i]=((((i*i)%mod)*b)%mod+(y*i)%mod)%mod;
		
	}
}
inline cic next(cic w) {
    int act = A[w.first] + B[w.second];
    if(act >= M)
		act -= M;
    return make_pair(w.second,act);
}
int main  () {
	
	f>>t0>>t1>>a>>b>>x>>y>>z>>M>>n;
	cic p1,p2,rr;
	precalcul();
	p1=make_pair(t0,t1);
	p2=next(p1);
	while (p1!=p2) {
		p1=next(p1);
		p2=next(next(p2));
	}
	
	
	
	
	inceput=0;
	p2=make_pair(t0,t1);
	while( p1!=p2  ) {
		p2=next(p2);
		inceput++;
	}
	
	lungime=0;
	
	while( p1!=p2 ) {
		
		p2=next(p2);
		++lungime;
		
	}
	if(n==0){
		g<<t0;
		return 0;
	}
	if(n==1){
		g<<t1;
		return 0;
	}
	if(n<inceput) {
		rr=make_pair(t0,t1);
		for(i=2;i<=n;i++)
			rr=next(rr);
		g<<rr.second<<"\n";
		return 0;
	}
	else{
		n-=inceput;
		n%=lungime;
		for(;n;--n)
			p1=next(p1);
		g<<p1.second<<"\n";
		return 0;
	}
	return 0;
	
}