Cod sursa(job #1265128)

Utilizator SebiSebiPirtoaca George Sebastian SebiSebi Data 16 noiembrie 2014 19:19:46
Problema Rsir Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.33 kb
#include<iostream>
#include<fstream>
using namespace std;

#define NMAX 7001

int a,b,x,y,z,MOD;
int va[NMAX],vb[NMAX],vz[NMAX];

int nextterm(int xn_1, int xn)
{
	if(xn_1<MOD && xn<MOD) {
		int x = va[xn_1] + vb[xn] + vz[z];
		while(x>=MOD)
			x=x-MOD;
		return x;
	}
	return (0LL + 1LL * a * xn_1 * xn_1 + 1LL * b * xn * xn + 1LL * x * xn_1 + 1LL * y * xn + z)%MOD;
	
}

void next(int &x, int &y)
{
	int xp;
	xp=x;
	x=y;
	y=nextterm(xp,x);
}

void floyd(int x0, int y0, int &start, int &lambda)
{
	int y1,y2,x1,x2;
	x1=x0;
	x2=y0;
	y1=x0;
	y2=y0;
	start=1;
	do {
		next(x1,x2);
		next(y1,y2);
		next(y1,y2);
		start++;
	}while(x1!=y1 || x2!=y2);
	lambda=1;
	next(y1,y2);
	while(x1!=y1 || x2!=y2) {
		next(y1,y2);
		lambda++;
	}
}

int reduce(long long term, int start, int lambda)
{
	long dist;
	if(term<=start)
		return term;
	dist=term-start;
	dist=1LL*dist/lambda;
	return term-1LL*dist*lambda;
}

int main ()
{
	int x0,y0,start,lambda,i;
	long long n;
	ifstream f("rsir.in");
	ofstream g("rsir.out");
	f>>x0>>y0>>a>>b>>x>>y>>z>>MOD>>n;
	f.close();
	for(i=0;i<=NMAX-1;i++) {
		va[i]=(0LL+1LL*a*i*i+x*i)%MOD;
		vb[i]=(0ll+1ll*b*i*i+y*i)%MOD;
		vz[i]=i%MOD;
	}
	floyd(x0,y0,start,lambda);
	n=reduce(n,start,lambda);
	for(i=1;i<=n;i++) 
		next(x0,y0);
	g<<x0;
	g.close();
	return 0;
}