Pagini recente » Monitorul de evaluare | Cod sursa (job #108743) | Istoria paginii utilizator/stargold2 | Monitorul de evaluare | Cod sursa (job #1652743)
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
using namespace std;
int n, m, x, y, modX, modY, offsetX, offsetY;
int cntAfter1Step[1005][1005], cnt1[1005], cnt2[1005];
vector< pair<int, int> > graph[1005][1005];
int distToXY[1005][1005], sol[670000];
int len;
void dfs(int xx, int yy) {
++len;
distToXY[xx][yy] = true;
int newX = (xx*xx + offsetX)%modX;
int newY = (yy*yy + offsetY)%modY;
if (distToXY[newX][newY] && (newX != x || newY != y)) {
len = 0;
return;
}
if (distToXY[newX][newY])
return;
dfs(newX, newY);
}
void dfs2(int xx, int yy, int level) {
distToXY[xx][yy] = level;
for (vector< pair<int, int> >::iterator it = graph[xx][yy].begin(); it != graph[xx][yy].end(); ++it) {
if (distToXY[it->first][it->second] != -1)
continue;
dfs2(it->first, it->second, level+1);
}
}
int main() {
freopen("robotei.in", "r", stdin);
freopen("robotei.out", "w", stdout);
scanf("%d%d%d%d%d%d%d%d", &n, &m, &x, &y, &modX, &modY, &offsetX, &offsetY);
for (int i = 0; i < n; ++i) {
cnt1[(1LL*i*i + offsetX)%modX]++;
cnt2[(1LL*i*i + offsetY)%modY]++;
}
for (int i = 0; i < modX; ++i)
for (int j = 0; j < modY; ++j)
cntAfter1Step[i][j] = cnt1[i]*cnt2[j];
m--;
for (int i = 0; i < modX; ++i) {
for (int j = 0; j < modY; ++j) {
int newX = (i*i + offsetX)%modX;
int newY = (j*j + offsetY)%modY;
graph[newX][newY].push_back(make_pair(i,j));
}
}
dfs(x, y);
memset(distToXY, -1, sizeof distToXY);
dfs2(x, y, 0);
for (int i = 0; i < modX; ++i) {
for (int j = 0; j < modY; ++j) {
if (distToXY[i][j] == -1 || distToXY[i][j] > m) {
distToXY[i][j] = 0;
continue;
}
distToXY[i][j] = 1 + (len > 0 ? ((m - distToXY[i][j]) / len) : 0);
}
}
for (int i = 0; i < modX; ++i) {
for (int j = 0; j < modY; ++j) {
sol[distToXY[i][j]] += cntAfter1Step[i][j];
}
}
int newX = (1LL*x*x + offsetX)%modX;
int newY = (1LL*y*y + offsetY)%modY;
sol[distToXY[newX][newY]]--;
sol[distToXY[newX][newY] + 1]++;
for (int i = 0; i <= m; ++i) {
if (sol[i] == 0)
continue;
printf("%d %d\n", i, sol[i]);
}
return 0;
}
//Trust me, I'm the Doctor!