Cod sursa(job #2937774)

Utilizator toma_ariciuAriciu Toma toma_ariciu Data 10 noiembrie 2022 22:54:50
Problema Robotei Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.7 kb
/// Preset de infoarena
#include <fstream>

using namespace std;

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

const int maxN = 1005, inf = 0x3f3f3f3f;
int n, m, x, y, addx, addy, modx, mody, dist[maxN][maxN], rx[maxN], ry[maxN];
int ans[maxN * maxN];
bool used[maxN][maxN];

int nxt(int x, int add, int mod)
{
    return(x * x + add) % mod;
}

void dfs(int x, int y)
{
    if(used[x][y])
        return;
    used[x][y] = 1;
    int nx = nxt(x, addx, modx), ny = nxt(y, addy, mody);
    dfs(nx, ny);
    dist[x][y] = 1 + dist[nx][ny];
}

int main()
{
    fin >> n >> m >> x >> y >> modx >> mody >> addx >> addy;
    for(int i = 0; i < n; i++)
    {
        rx[nxt(i, addx, modx)]++;
        ry[nxt(i, addy, mody)]++;
    }
    for(int i = 0; i < modx; i++)
        for(int j = 0; j < mody; j++)
            dist[i][j] = inf;
    dist[x][y] = 0;
    used[x][y] = 1;
    for(int i = 0; i < modx; i++)
        for(int j = 0; j < mody; j++)
            dfs(i, j);
    int nx = nxt(x, addx, modx), ny = nxt(y, addy, mody);
    for(int i = 0; i < modx; i++)
    {
        for(int j = 0; j < mody; j++)
        {
            int nr = rx[i] * ry[j], nrap = (m - dist[i][j] - 1) / (dist[nx][ny] + 1);
            if(i == nx && j == ny)
            {
                nr--;
                if(dist[i][j] + 1 > m)
                    ans[1]++;
                else
                    ans[2 + nrap]++;
            }
            if(dist[i][j] + 1 > m)
                ans[0] += nr;
            else
                ans[1 + nrap] += nr;
        }
    }
    for(int i = 0; i <= m; i++)
        if(ans[i])
            fout << i << ' ' << ans[i] << '\n';
    return 0;
}