Cod sursa(job #3316783)

Utilizator Andrei1209Andrei Mircea Andrei1209 Data 20 octombrie 2025 21:37:10
Problema Robotei Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.65 kb
#include <fstream>

using namespace std;
ifstream fin("robotei.in");
ofstream fout("robotei.out");
const int dim = 1000;
int dist[dim + 5][dim + 5], fLin[dim + 5], fCol[dim + 5], rasp[1000005];
int n, m, modx, mody, offsetX, offsetY, x, y, mat[20][20][20];
void reset()
{
    int i, j;
    for ( i = 0; i < modx; ++i )
        for ( j = 0; j < mody; ++j )
            dist[i][j] = -1;
}
void calc( int i, int j )
{
    int nxti = (i * i + offsetX) % modx;
    int nxtj = (j * j + offsetY) % mody;
    if ( dist[i][j] != -1 )
        return ;
    if ( dist[nxti][nxtj] == - 1 )
        calc(nxti, nxtj);
    dist[i][j] = dist[nxti][nxtj] + 1;
}
int main()
{
    fin >> n >> m;
    fin >> x >> y >> modx >> mody >> offsetX >> offsetY;
    if ( x >= modx || y >= mody )
    {
        fout << 1 << " " << 1 << "\n";
        return 0;
    }
    int i, j;
    for ( i = 0; i < n; ++i )
    {
        int nxti = (i * i + offsetX) % modx;
        int nxtj = (i * i + offsetY) % mody;
        ++fLin[nxti];
        ++fCol[nxtj];

    }
    reset();
    dist[x][y] = 0;
    for ( i = 0; i < modx; ++i )
        for ( j = 0; j < mody; ++j )
        {
            calc(i, j);
        }

    for ( i = 0; i < n; ++i )
        for ( j = 0; j < n; ++j )
            mat[i][j][0] = 1;
    for ( int k = 1;k <= m; ++k )
    {
        for ( i = 0; i < n; ++i )
            for ( j = 0; j < n; ++j )
            {
                if ( mat[i][j][k - 1] == 0 )
                    continue;
                int nxti = (i * i + offsetX) % modx;
                int nxtj = (j * j + offsetY) % mody;
                mat[nxti][nxtj][k] += mat[i][j][k - 1];
            }
   /*     for ( i = 0; i < n; ++i, fout << endl )
            for ( j = 0; j < n; ++j )
                fout << mat[i][j][k] << " ";
    fout << "------------------------\n";*/
    }

    ///fout << endl << endl << endl;


///fout << dist[x][y] << endl;

    int nxti, nxtj;
    nxti = (x * x + offsetX) % modx;
    nxtj = (y * y + offsetY) % mody;
    int cycle = 1 + dist[nxti][nxtj];
    rasp[m / cycle + 1]++;
    for ( i = 0; i < modx; ++i )
        for ( j = 0; j < mody; ++j )
        {
          //  fout << fLin[i] * fCol[j] << " ";
            if ( i == nxti && j == nxtj)
                rasp[(m - dist[i][j] - 1) / cycle + 1] += fLin[i] * fCol[j] - 1;
            else
                rasp[(m - dist[i][j] - 1) / cycle + 1] += fLin[i] * fCol[j];/// adica adunam cati roboti sunt in au ajuns in celula dupa prima mutare;
        }

    for ( i = 1; i <= 1000000; ++i )
        if ( rasp[i] )
            fout << i << " " << rasp[i] << '\n';


    return 0;
}