Cod sursa(job #733669)

Utilizator mihaipopa12Popa Mihai mihaipopa12 Data 12 aprilie 2012 18:52:41
Problema Rsir Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.22 kb
#include<stdio.h>
#include<vector>

#define maxdim 7005

using namespace std;

FILE*f=fopen("rsir.in","r");
FILE*g=fopen("rsir.out","w");

int a,b,x,y,z,mod;
int A[maxdim],B[maxdim];
pair<int,int>x0,r;

inline pair<int,int> next( const pair<int,int> &x ){
	r.second = x.first;
	r.first = A[x.second] + B[x.first];
	if ( r.first >= mod )	r.first -= mod;
	
	return r;
}

int main () {
	
	long long n;
	fscanf(f,"%d %d %d %d %d %d %d %d",&x0.second,&x0.first,&a,&b,&x,&y,&z,&mod);
	x0.second %= mod; x0.first %= mod;
	fscanf(f,"%lld",&n);
	
	for ( int i = 0 ; i < mod ; ++i ){
		A[i] = (1LL*a*i*i + x*i + z) % mod;
		B[i] = (1LL*b*i*i + y*i) % mod;
	}
	
	pair<int,int>p,u;
	p = next(x0); u = next(p);
	
	while ( p != u ){
		p = next(p); 
		u = next(u); u = next(u);
	}
	
	p = x0;
	int coada = 0;
	while ( p != u ){
		++coada;
		p = next(p);
		u = next(u);
	}
	
	int lung = 1; u = next(p);
	while ( p != u ){
		++lung;
		u = next(u);
	}
	
	if ( n > coada + lung ){
		n = coada + (n-coada)%lung; if (!((n-coada)%lung))	++n;
	}
	
	pair<int,int>sol = x0;
	for ( int i = 2 ; i <= n ; ++i ){
		sol = next(sol);
	}
	
	fprintf(g,"%d\n",sol.first);
	
	fclose(f);
	fclose(g);
	
	return 0;
}