Pagini recente » Cod sursa (job #883140) | Cod sursa (job #1230367) | Cod sursa (job #2595518) | Cod sursa (job #190589) | Cod sursa (job #1652736)
#include <fstream>
#include <algorithm>
#include <cstring>
#include <vector>
using namespace std;
ifstream fin("robotei.in");
ofstream fout("robotei.out");
int n, m, x, y, modX, modY, offsetX, offsetY;
int cntAfter1Step[1005][1005], cnt1[1005], cnt2[1005];
vector< pair<int, int> > graph[1005][1005];
bool vis[1005][1005];
int distToXY[1005][1005], sol[670000];
int len;
void dfs(int xx, int yy) {
++len;
vis[xx][yy] = true;
int newX = (1LL*xx*xx + offsetX)%modX;
int newY = (1LL*yy*yy + offsetY)%modY;
if (vis[newX][newY] && (newX != x || newY != y)) {
len = 0;
return;
}
if (vis[newX][newY])
return;
dfs(newX, newY);
}
void dfs2(int xx, int yy, int level) {
vis[xx][yy] = true;
distToXY[xx][yy] = level;
for (vector< pair<int, int> >::iterator it = graph[xx][yy].begin(); it != graph[xx][yy].end(); ++it) {
if (vis[it->first][it->second])
continue;
dfs2(it->first, it->second, level+1);
}
}
int main() {
fin >> 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 = (1LL*i*i + offsetX)%modX;
int newY = (1LL*j*j + offsetY)%modY;
graph[newX][newY].push_back(make_pair(i,j));
}
}
dfs(x, y);
memset(vis, false, sizeof vis);
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;
fout << i << ' ' << sol[i] << '\n';
}
return 0;
}
//Trust me, I'm the Doctor!