Cod sursa(job #1459568)

Utilizator SmarandaMaria Pandele Smaranda Data 10 iulie 2015 11:27:14
Problema Robotei Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.16 kb
#include <cstdio>
#include <vector>

using namespace std;

const int N = 45000, MAX = 1000003;

int n, m, x, y, modx, mody, offsetx, offsety;
int fx [N], nr [1001][1001], fy [N], time [MAX], num [666800];
vector <int> graph [MAX];
bool used [MAX];

void dfs (int x) {
    vector <int> :: iterator it;

    used [x] = true;
    for (it = graph [x].begin (); it != graph [x].end (); ++ it)
        if (!used [*it]) {
            time [*it] = time [x] + 1;
            dfs (*it);
        }
}

int main () {
    int i, nx, ny, cx, cy, pas, cod1, cod2, ccx, ccy, j, ori;

    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);
    cx = x; cy = y;
    ccx = (x * x + offsetx) % modx;
    ccy = (y * y + offsety) % mody;
    pas = 0;
    for (i = 1; i <= m; i ++) {
        nx = (x * x + offsetx) % modx;
        ny = (y * y + offsety) % mody;
        if (nx == cx && ny == cy) {
            pas = i;
            break;
        }
        x = nx;
        y = ny;
    }
    for (i = 0; i < n; i ++) {
        nx = (i * i + offsetx) % modx;
        fx [nx] ++;
    }
     for (i = 0; i < n; i ++) {
        ny = (i * i + offsety) % mody;
        fy [ny] ++;
    }
    for (i = 0; i < modx; i ++)
        for (j = 0; j < mody; j ++) {
            nr [i][j] = fx [i] * fy [j];
            nx = (i * i + offsetx) % modx;
            ny = (j * j + offsety) % mody;
            cod1 = i * mody + j;
            cod2 = nx * mody + ny;
            graph [cod2].push_back (cod1);
        }
    cod1 = cx * mody + cy;
    dfs (cod1);
    m --;
    for (i = 0; i < modx; i ++)
        for (j = 0; j < mody; j ++)
            if (nr [i][j]) {
                cod1 = i * mody + j;
                ori = (m - time [cod1])/pas + 1;
                num [ori] = num [ori] + nr [i][j];
                if (i == ccx && j == ccy) {
                    num [ori] --;
                    num [ori + 1] ++;
                }
            }
    for (i = 0; i <= m; i ++)
        if (num [i])
            printf ("%d %d\n", i, num [i]);
    return 0;
}