Cod sursa(job #3300931)

Utilizator vicvicGriga Victor-Cristian vicvic Data 20 iunie 2025 12:18:41
Problema Robotei Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.63 kb
#include <bits/stdc++.h>
#define int long long
using namespace std;
ifstream f ("robotei.in");
ofstream g ("robotei.out");
const int NMAX=1e6;
int n, m, x, y, modx, mody, offsetx, offsety, rez[NMAX+5], X[NMAX+5], Y[NMAX+5], viz[1005][1005];
int nr (int x, int y)
{
    return (x-1)*n+y;
}
void dfs (int i, int j)
{
    int inou, jnou;
    viz[i][j]=-1;
    inou=(i*i+offsetx)%modx;
    jnou=(j*j+offsety)%mody;
    if (viz[inou][jnou]==0)
        dfs (inou, jnou);
    if (viz[inou][jnou]!=-1)
        viz[i][j]=viz[inou][jnou]+1;
}
int32_t main ()
{
    f >> n >> m >> x >> y >> modx >> mody >> offsetx >> offsety;
    for (int i=0;i<n;i++)
    {
        X[(i*i+offsetx)%modx]++;
        Y[(i*i+offsety)%mody]++;
    }
    viz[x][y]=1;
    for (int i=0;i<modx;i++)
    {
        for (int j=0;j<mody;j++)
        {
            if (viz[i][j]==0)
                dfs (i, j);
        }
    }
    int lncycle=viz[(x*x+offsetx)%modx][(y*y+offsety)%mody];
    for (int i=0;i<modx;i++)
    {
        for (int j=0;j<mody;j++)
        {
            int l=viz[i][j];
            if (l>0 && l<=m)
            {
                if (lncycle<=0)
                    rez[1]+=X[i]*Y[j];
                else
                    rez[1+(m-l)/lncycle]+=X[i]*Y[j];
            }
            else
                rez[0]+=X[i]*Y[j];
        }
    }
    x=(x*x+offsetx)%modx;
    y=(y*y+offsety)%mody;
    if (lncycle<=0)
    {
        rez[0]--;
        rez[1]++;
    }
    else
    {
        rez[1+(m-viz[x][y])/lncycle]--;
        rez[2+(m-viz[x][y])/lncycle]++;
    }
    for (int i=0;i<=m;i++)
    {
        if (rez[i]!=0)
            cout << i << " " << rez[i] << "\n";
    }
    return 0;
}