Pagini recente » Cod sursa (job #53614) | Cod sursa (job #3155557) | Cod sursa (job #2095459) | Galerie | Cod sursa (job #1459568)
#include <cstdio>
#include <vector>
using namespace std;
const int N = 45000, MAX = 1000003;
int n, m, x, y, modx, mody, offsetx, offsety;
int fx [N], nr [1001][1001], fy [N], time [MAX], num [666800];
vector <int> graph [MAX];
bool used [MAX];
void dfs (int x) {
vector <int> :: iterator it;
used [x] = true;
for (it = graph [x].begin (); it != graph [x].end (); ++ it)
if (!used [*it]) {
time [*it] = time [x] + 1;
dfs (*it);
}
}
int main () {
int i, nx, ny, cx, cy, pas, cod1, cod2, ccx, ccy, j, ori;
freopen ("robotei.in", "r", stdin);
freopen ("robotei.out", "w", stdout);
scanf ("%d%d%d%d%d%d%d%d", &n, &m, &x, &y, &modx, &mody, &offsetx, &offsety);
cx = x; cy = y;
ccx = (x * x + offsetx) % modx;
ccy = (y * y + offsety) % mody;
pas = 0;
for (i = 1; i <= m; i ++) {
nx = (x * x + offsetx) % modx;
ny = (y * y + offsety) % mody;
if (nx == cx && ny == cy) {
pas = i;
break;
}
x = nx;
y = ny;
}
for (i = 0; i < n; i ++) {
nx = (i * i + offsetx) % modx;
fx [nx] ++;
}
for (i = 0; i < n; i ++) {
ny = (i * i + offsety) % mody;
fy [ny] ++;
}
for (i = 0; i < modx; i ++)
for (j = 0; j < mody; j ++) {
nr [i][j] = fx [i] * fy [j];
nx = (i * i + offsetx) % modx;
ny = (j * j + offsety) % mody;
cod1 = i * mody + j;
cod2 = nx * mody + ny;
graph [cod2].push_back (cod1);
}
cod1 = cx * mody + cy;
dfs (cod1);
m --;
for (i = 0; i < modx; i ++)
for (j = 0; j < mody; j ++)
if (nr [i][j]) {
cod1 = i * mody + j;
ori = (m - time [cod1])/pas + 1;
num [ori] = num [ori] + nr [i][j];
if (i == ccx && j == ccy) {
num [ori] --;
num [ori + 1] ++;
}
}
for (i = 0; i <= m; i ++)
if (num [i])
printf ("%d %d\n", i, num [i]);
return 0;
}