Pagini recente » Cod sursa (job #2559956) | Cod sursa (job #3168703) | Cod sursa (job #1926441) | Cod sursa (job #932428) | Cod sursa (job #2835349)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("robotei.in");
ofstream fout("robotei.out");
const int NMAX(1005);
vector<int> GT[NMAX * NMAX];
int n, m, x, y, modx, mody, offsetX, offsetY, dist[NMAX * NMAX], rez[NMAX * NMAX], G[NMAX * NMAX];
bool viz[NMAX * NMAX];
inline int getId(int i, int j)
{
return i * m + j;
}
pair<int, int> getPer(int val)
{
int i = val / m;
int j = val - i * m;
return {i, j};
}
inline void DFST(int nod)
{
for(auto it: GT[nod])
if(dist[it] == -1)
{
dist[it] = dist[nod] + 1;
DFST(it);
}
}
int main()
{
fin >> n >> m >> x >> y >> modx >> mody >> offsetX >> offsetY;
for(int i = 0; i < n; ++i)
for(int j = 0; j < n; ++j)
{
int newX = (i * i + offsetX) % modx, newY = (j * j + offsetY) % mody;
G[getId(i, j)] = getId(newX, newY);
GT[getId(newX, newY)].push_back(getId(i, j));
dist[getId(i, j)] = -1;
}
int ok = -1;
int nd = getId(x, y), nrP = 0;
viz[nd] = 1;
while(1)
{
nd = G[nd];
++nrP;
if(viz[nd])
{
if(nd == getId(x, y))
ok = 1;
else ok = 0;
break;
}
viz[nd] = 1;
}
nd = getId(x, y);
dist[nd] = 0;
DFST(nd);
for(int i = 0; i < n; ++i)
for(int j = 0; j < n; ++j)
if(dist[getId(i, j)] != -1)
{
int nod = getId(i, j), times = 0;
if(dist[nod] <= m)
{
++times;
if(ok)
times += (m - dist[nod]) / nrP;
}
rez[times]++;
}
for(int i = 0; i <= m; ++i)
if(rez[i])
fout << i << ' ' << rez[i] << '\n';
return 0;
}