Cod sursa(job #502484)

Utilizator dcm9000Dinu Cristian Mircea - UPB dcm9000 Data 19 noiembrie 2010 18:26:38
Problema Robotei Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.81 kb
#include <iostream>
#include <fstream>

using namespace std;

int N,M,X,Y,modX,modY,offX,offY;

#define INFY 1000000000

int INIT[1000][1000];
int TIME[1000][1000];
int VISI[1000][1000];
int RES[1000000];

static inline int nextX(int x) { return (x*x+offX)%modX; }
static inline int nextY(int y) { return (y*y+offY)%modY; }

void calcInit(void)
{
	int x,y;
	for (y=0; y<modY; y++) for (x=0; x<modX; x++) INIT[x][y] = 0;	
	for (y=0; y<modY; y++)
		for (x=0; x<modX; x++)
		{
			int countX=(N+modY-1-y)/modY;
			int countY=(N+modX-1-x)/modX;			
			INIT[nextX(x)][nextY(y)] += countX*countY;
		}

	INIT[nextX(X)][nextY(Y)]--;
}

void calcTimeRec(int x, int y)
{
	if (TIME[x][y] != -1) return;

	TIME[x][y] = INFY;

	int destX=nextX(x);
	int destY=nextY(y);
	
	calcTimeRec(destX,destY);
	
	int k = TIME[destX][destY]+1;
	
	TIME[x][y] = k>INFY ? INFY : k;	
}

void calcTime(void)
{
	int x,y;
	for (y=0; y<modY; y++) for (x=0; x<modX; x++) TIME[x][y] = -1;	
	
	TIME[X][Y]=0;

	for (y=0; y<modY; y++)
		for (x=0; x<modX; x++)
			calcTimeRec(x,y);
}

void calcVisits(void)
{
	int period = 1+TIME[nextX(X)][nextY(Y)];
	if (period > INFY) period = INFY;

	int x,y;
	for (y=0; y<modY; y++)
		for (x=0; x<modX; x++)
		{
			VISI[x][y] = 0;
			if (TIME[x][y] > M-1) continue;
			
			VISI[x][y] = 1+((M-1-TIME[x][y])/period);
		}
}

void calcResults(void)
{
	int period = 1+TIME[nextX(X)][nextY(Y)];
	if (period > INFY) period = INFY;

	int i,x,y;
	for (i=0; i<=M; i++) RES[i] = 0;

	for (y=0; y<modY; y++)
		for (x=0; x<modX; x++)
			RES[VISI[x][y]] += INIT[x][y];

	RES[1 + M/period]++;
}

int main()
{
	ifstream fisIn("robotei.in");
	ofstream fisOut("robotei.out");

	fisIn >> N >> M >> X >> Y >> modX >> modY >> offX >> offY;
	
	calcInit();
	calcTime();
	calcVisits();
	calcResults();

	int i;
	for (i=1; i<M; i++) if (RES[i]) fisOut << i << " " << RES[i] << "\n";

}