Pagini recente » Cod sursa (job #2973962) | Cod sursa (job #428349) | Cod sursa (job #2759412) | Cod sursa (job #2094921) | Cod sursa (job #2939776)
#include <fstream>
#include <bitset>
using namespace std;
ifstream in ("robotei.in");
ofstream out ("robotei.out");
const int max_size = 1e3 + 100, max_ans = 1e6 + 101, INF = 1e9 + 1;
long long dx[max_size], dy[max_size], d[max_size][max_size], ans[max_ans], modx, mody, addx, addy;
bitset <max_size> viz[max_size];
void dfs (int i, int j)
{
if (viz[i][j])
{
return;
}
viz[i][j] = 1;
int ii = (i * i + addx) % modx, jj = (j * j + addy) % mody;
dfs(ii, jj);
d[i][j] = d[ii][jj] + 1;
}
int main ()
{
for (int i = 0; i < max_size; i++)
{
for (int j = 0; j < max_size; j++)
{
d[i][j] = INF;
}
}
int n, m, x, y, xx, yy;
in >> n >> m >> x >> y >> modx >> mody >> addx >> addy;
d[x][y] = 0;
viz[x][y] = 1;
xx = (x * x + addx) % modx;
yy = (y * y + addy) % mody;
for (int i = 0; i < n; i++)
{
dx[(i * i + addx) % modx]++;
dy[(i * i + addy) % mody]++;
}
for (int i = 0; i < modx; i++)
{
for (int j = 0; j < mody; j++)
{
dfs(i, j);
}
}
for (int i = 0; i < modx; i++)
{
for (int j = 0; j < mody; j++)
{
int pct = dx[i] * dy[j], ct = (m - d[i][j] - 1) / (d[xx][yy] + 1);
if (i == xx && j == yy)
{
pct--;
if (d[i][j] + 1 > m)
{
ans[1]++;
}
else
{
ans[2 + ct]++;
}
}
if (d[i][j] + 1 > m)
{
ans[0] += pct;
}
else
{
ans[1 + ct] += pct;
}
}
}
for (int i = 0; i <= m; i++)
{
if (ans[i] > 0)
{
out << i << " " << ans[i] << '\n';
}
}
in.close();
out.close();
return 0;
}