Cod sursa(job #1652743)

Utilizator iordache.bogdanIordache Ioan-Bogdan iordache.bogdan Data 15 martie 2016 12:51:59
Problema Robotei Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.56 kb
#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!