Cod sursa(job #2939774)

Utilizator IvanAndreiIvan Andrei IvanAndrei Data 14 noiembrie 2022 08:15:40
Problema Robotei Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.96 kb
#include <fstream>
#include <bitset>

using namespace std;

ifstream in ("robotei.in");
ofstream out ("robotei.out");

const int max_size = 1e3 + 1, INF = 1e9 + 1;

int dx[max_size], dy[max_size], d[max_size][max_size], ans[max_size], modx, mody, addx, addy;
bitset <max_size> viz[max_size];

void dfs (int i, int j)
{
    if (viz[i][j])
    {
        return;
    }
    viz[i][j] = 1;
    int ii = (i * i + addx) % modx, jj = (j * j + addy) % mody;
    dfs(ii, jj);
    d[i][j] = d[ii][jj] + 1;
}

int main ()
{
    for (int i = 0; i < max_size; i++)
    {
        for (int j = 0; j < max_size; j++)
        {
            d[i][j] = INF;
        }
    }
    int n, m, x, y, xx, yy;
    in >> n >> m >> x >> y >> modx >> mody >> addx >> addy;
    d[x][y] = 0;
    viz[x][y] = 1;
    xx = (x * x + addx) % modx;
    yy = (y * y + addy) % mody;
    for (int i = 0; i < n; i++)
    {
        dx[(i * i + addx) % modx]++;
        dy[(i * i + addy) % mody]++;
    }
    for (int i = 0; i < modx; i++)
    {
        for (int j = 0; j < mody; j++)
        {
            dfs(i, j);
        }
    }
    for (int i = 0; i < modx; i++)
    {
        for (int j = 0; j < mody; j++)
        {
            int pct = dx[i] * dy[j], ct = (m - d[i][j] - 1) / (d[xx][yy] + 1);
            if (i == xx && j == yy)
            {
                pct--;
                if (d[i][j] + 1 > m)
                {
                    ans[1]++;
                }
                else
                {
                    ans[2 + ct]++;
                }
            }
            if (d[i][j] + 1 > m)
            {
                ans[0] += pct;
            }
            else
            {
                ans[1 + ct] += pct;
            }
        }
    }
    for (int i = 0; i <= m; i++)
    {
        if (ans[i] > 0)
        {
            out << i << " " << ans[i] << '\n';
        }
    }
    in.close();
    out.close();
    return 0;
}