Cod sursa(job #1713609)

Utilizator akaprosAna Kapros akapros Data 6 iunie 2016 00:46:05
Problema Robotei Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.97 kb
#include <bits/stdc++.h>
#define maxM 1000002
#define maxN 1002
#define inf 1000000000
using namespace std;
int n, m, X, Y, modx, mody, offx, offy, len;
int ans[maxM], ox[maxN], oy[maxN];
int vis[maxN][maxN];
bool a[maxN][maxN];
void read()
{
    freopen("robotei.in", "r", stdin);
    scanf("%d %d %d %d %d %d %d %d", &n, &m, &X, &Y, &modx, &mody, &offx, &offy);
}
void bfs(int x, int y)
{
    int nx, ny;
    vis[x][y] = -1;
    nx = (x * x + offx) % modx;
    ny = (y * y + offy) % mody;
    if (vis[nx][ny] == inf)
        bfs(nx, ny);
    if (vis[nx][ny] != -1)
        vis[x][y] = vis[nx][ny] + 1;
}
void solve()
{
    int i, j, l;
    int x = X, y = Y;

    for (i = 0; i < n; ++ i)
    {
        ++ ox[(i * i + offx) % modx];
        ++ oy[(i * i + offy) % mody];
    }
    for (i = 0; i < modx; ++ i)
        for (j = 0; j < mody; ++ j)
            vis[i][j] = inf;
    vis[X][Y] = 0;

    for (i = 0; i < modx; ++ i)
        for (j = 0; j < mody; ++ j)
            if (vis[i][j] == inf)
                bfs(i, j);
     len = vis[(X * X + offx) % modx][(Y * Y + offy) % mody] + 1;

    for (i = 0; i < modx; ++ i)
        for (j = 0; j < mody; ++ j)
        {
            l = vis[i][j];
            if (l >= 0 && l < m)
            {
                if (len)
                    ans[1 + (m - l - 1) / len] += ox[i] * oy[j];
                else
                ans[1] += ox[i] * oy[j];
            }else
            ans[0] += ox[i] * oy[j];
        }
    X = (X * X + offx) % modx;
    Y = (Y * Y + offy) % mody;
    if (!len)
    {
        -- ans[0];
        ++ ans[1];
    }
        else
    {
     -- ans[1 + (m - vis[X][Y] - 1) / len];
        ++ ans[2 + (m - vis[X][Y] - 1) / len];}

}
void write()
{
    int i;
    freopen("robotei.out", "w", stdout);

    for (i = 0; i <= m; ++ i)
        if (ans[i] != 0)
            printf("%d %d\n", i, ans[i]);
}
int main()
{
    read();
    solve();
    write();
    return 0;
}