Pagini recente » Cod sursa (job #2876772) | Cod sursa (job #2667599) | Cod sursa (job #121652) | Cod sursa (job #1389535) | Cod sursa (job #3318064)
#include <fstream>
#include <iostream>
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[666735];
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 || dist[i][j] == -2 )
return ;
dist[i][j] = -2;///pt evitarea ciclului infinit + semnifica ca nu se poate ajunge la (x, y) din (i, j)
if ( dist[nxti][nxtj] == - 1 )
calc(nxti, nxtj);
if ( dist[nxti][nxtj] >= 0 )
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 << 0 << " " << n * n - 1 << '\n';
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);
}
int nxti, nxtj;
nxti = (x * x + offsetX) % modx;
nxtj = (y * y + offsetY) % mody;
// cerr << dist[nxti][nxtj] << '\n';
if ( dist[nxti][nxtj] != -2 )
{
int cycle = 1 + dist[nxti][nxtj];
rasp[m / cycle + 1]++;
// cerr << cycle << '\n';
for ( i = 0; i < modx; ++i )
for ( j = 0; j < mody; ++j )
{
// cerr << i << ' ' << j << ' ' << dist[i][j] << ' ' << fLin[i] << ' ' << fCol[j] << '\n';
if ( i == nxti && j == nxtj)
rasp[(m - dist[i][j] - 1) / cycle + 1] += fLin[i] * fCol[j] - 1;
else if ( dist[i][j] != -2 )///daca se poate
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;
else
if ( dist[i][j] == -2 )
rasp[0]+= fLin[i] * fCol[j];
}
}
else
{
for ( i = 0; i < modx; ++i )
for ( j = 0; j < mody; ++j ) {
int nr = fLin[i] * fCol[j];
if (i == nxti && j == nxtj) {
rasp[1]++;
nr--;
}
if (dist[i][j] == -2) {
rasp[0] += nr;
} else if ( dist[i][j] <= m)
rasp[1] += nr;
}
}
for ( i = 0; i <= m; ++i )
if ( rasp[i] )
fout << i << " " << rasp[i] << '\n';
return 0;
}