Pagini recente » Cod sursa (job #242512) | Cod sursa (job #2012620) | Rating David David (Davidbos) | Cod sursa (job #1662776) | Cod sursa (job #1539945)
#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;
}