Pagini recente » Cod sursa (job #1292753) | Cod sursa (job #552743) | Pitici2 | Monitorul de evaluare | Cod sursa (job #502487)
Cod sursa(job #502487)
#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";
}