Pagini recente » Cod sursa (job #3307457) | Cod sursa (job #2918667) | Monitorul de evaluare | Cod sursa (job #3309197) | Cod sursa (job #3318037)
#include <fstream>
#include <cstring>
using namespace std;
ifstream fin("robotei.in");
ofstream fout("robotei.out");
#define int long long
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;
void reset()
{
for (int i = 0; i < modx; ++i)
for (int j = 0; j < mody; ++j)
dist[i][j] = -1;
}
void calc(int i, int j)
{
if (dist[i][j] != -1)
return;
int nxti = (i * i + offsetX) % modx;
int nxtj = (j * j + offsetY) % mody;
dist[i][j] = -2;
if (dist[nxti][nxtj] == -1)
calc(nxti, nxtj);
if (dist[nxti][nxtj] >= 0)
dist[i][j] = dist[nxti][nxtj] + 1;
}
signed main()
{
fin >> n >> m;
fin >> x >> y >> modx >> mody >> offsetX >> offsetY;
if (x >= modx || y >= mody)
{
fout << 1 << " " << 1 << "\n";
return 0;
}
for (int i = 0; i < n; ++i)
{
int nxti = (i * i + offsetX) % modx;
++fLin[nxti];
}
for (int j = 0; j < n; ++j)
{
int nxtj = (j * j + offsetY) % mody;
++fCol[nxtj];
}
reset();
dist[x][y] = 0;
for (int i = 0; i < modx; ++i)
for (int j = 0; j < mody; ++j)
calc(i, j);
int nxti = (x * x + offsetX) % modx;
int nxtj = (y * y + offsetY) % mody;
int cycle = 1 + dist[nxti][nxtj];
rasp[m / cycle + 1]++;
for (int i = 0; i < modx; ++i)
for (int j = 0; j < mody; ++j)
if (dist[i][j] >= 0)
{
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];
}
for (int i = 1; i <= 1000000; ++i)
if (rasp[i])
fout << i << " " << rasp[i] << '\n';
return 0;
}