Cod sursa(job #2218500)

Utilizator NOSCOPEPROKENDYMACHEAMACUMVREAU NOSCOPEPROKENDY Data 4 iulie 2018 18:12:30
Problema Robotei Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.96 kb
#include <cstdio>

using namespace std;

const int MAX_M = 1000;

int fx[MAX_M + 5], fy[MAX_M + 5];
int d[MAX_M + 5][MAX_M + 5], ajung[MAX_M + 5][MAX_M + 5], viz[MAX_M + 5][MAX_M + 5];
int ans[666735];
int mx, my, ox, oy;

int nxt(int c, int o, int m) {
  return (c * c + o) % m;
}

void dfs(int x, int y) {
  viz[x][y] = 1;
  int x1 = nxt(x, ox, mx), y1 = nxt(y, oy, my);
  if (!viz[x1][y1])
    dfs(x1, y1);
  ajung[x][y] = ajung[x1][y1];
  d[x][y] = 1 + d[x1][y1];
}

int main() {
  freopen("robotei.in", "r", stdin);
  freopen("robotei.out", "w", stdout);

  int n, m, x, y;
  scanf("%d%d%d%d%d%d%d%d", &n, &m, &x, &y, &mx, &my, &ox, &oy);
  for (int i = 0; i < n; ++i)
    fx[nxt(i, ox, mx)]++;
  for (int i = 0; i < n; ++i)
    fy[nxt(i, oy, my)]++;
  viz[x][y] = ajung[x][y] = 1;
  for (int i = 0; i < mx; ++i)
    for (int j = 0; j < my; ++j)
      if (!viz[i][j])
        dfs(i, j);
  int x1 = nxt(x, ox, mx), y1 = nxt(y, oy, my), c = -1;
  if (ajung[x1][y1])
    c = 1 + d[x1][y1];
  m--;
  for (int i = 0; i < mx; ++i)
    for (int j = 0; j < my; ++j) {
      int nr = fx[i] * fy[j];
      if (i == x1 && j == y1) {
        nr--;
        if (ajung[i][j]) {
          if (c == -1) {
            if (d[i][j] <= m)
              ans[2]++;
            else
              ans[2]++;
          } else {
            if (d[i][j] <= m)
              ans[2 + (m - d[i][j]) / c]++;
            else
              ans[1]++;
          }
        } else {
          ans[1]++;
        }
      }
      if (ajung[i][j]) {
        if (c == -1) {
          if (d[i][j] <= m)
            ans[1] += nr;
          else
            ans[0] += nr;
        } else {
          if (d[i][j] <= m)
            ans[1 + (m - d[i][j]) / c] += nr;
          else
            ans[0] += nr;
        }
      } else {
        ans[0] += nr;
      }
    }

  for (int i = 0; i <= m; ++i)
    if (ans[i])
      printf("%d %d\n", i, ans[i]);
  return 0;
}