Cod sursa(job #1539945)

Utilizator vladrochianVlad Rochian vladrochian Data 1 decembrie 2015 20:26:05
Problema Robotei Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.85 kb
#include <fstream>

using namespace std;

const int MOD_MAX = 1000;
const int M_MAX = 666732;

ifstream fin("robotei.in");
ofstream fout("robotei.out");

int N, M, X, Y;
int modX, modY;
int offsetX, offsetY;

int cntx[MOD_MAX + 5];
int cnty[MOD_MAX + 5];

int cnt[MOD_MAX + 5][MOD_MAX + 5];
int dist[MOD_MAX + 5][MOD_MAX + 5];
int cycle_size;

int visits[MOD_MAX + 5][MOD_MAX + 5];
int ans[M_MAX + 5];

inline int NextX(int x) { return (x * x + offsetX) % modX; }
inline int NextY(int y) { return (y * y + offsetY) % modY; }

void GetDist(int x, int y) {
   dist[x][y] = -1;
   int nx = NextX(x);
   int ny = NextY(y);
   if (dist[nx][ny] == -2)
      GetDist(nx, ny);
   if (dist[nx][ny] != -1)
      dist[x][y] = dist[nx][ny] + 1;
}

int main() {
   fin >> N >> M >> X >> Y >> modX >> modY >> offsetX >> offsetY;

   if (X >= N || Y >= N)
      return 0;
   if (X >= modX || Y >= modY) {
      fout << "1 1\n";
      return 0;
   }

   for (int i = 0; i < N; ++i) {
      ++cntx[NextX(i)];
      ++cnty[NextY(i)];
   }
   for (int i = 0; i < modX; ++i)
      for (int j = 0; j < modY; ++j) {
         cnt[i][j] = cntx[i] * cnty[j];
         dist[i][j] = -2;
      }

   dist[X][Y] = 0;
   for (int i = 0; i < modX; ++i)
      for (int j = 0; j < modY; ++j)
         if (dist[i][j] == -2)
            GetDist(i, j);
   cycle_size = dist[NextX(X)][NextY(Y)] + 1;

   for (int i = 0; i < modX; ++i)
      for (int j = 0; j < modY; ++j)
         if (dist[i][j] != -1 && dist[i][j] < M) {
            visits[i][j] = 1 + (cycle_size ? (M - 1 - dist[i][j]) / cycle_size : 0);
            ans[visits[i][j]] += cnt[i][j];
         }
   --ans[visits[NextX(X)][NextY(Y)]];
   ++ans[visits[NextX(X)][NextY(Y)] + 1];

   for (int i = 0; i <= M; ++i)
      if (ans[i])
         fout << i << " " << ans[i] << "\n";
   return 0;
}