Pagini recente » Cod sursa (job #1548873) | Cod sursa (job #2884879) | Cod sursa (job #2865814) | Cod sursa (job #2317288) | Cod sursa (job #1456944)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("curcubeu.in");
const int MAX = 1000005;
int f[MAX], n, qa[MAX], qb[MAX], qc[MAX], col[MAX];
int find_root(int x) {
int a = x;
while (x != f[x])
x = f[x];
while (a != f[a]) {
int temp = f[a];
f[a] = x;
a = temp;
}
return x;
}
void unite (int x, int y) {
f[x] = y;
}
int main() {
freopen("curcubeu.out", "w", stdout);
fin >> n >> qa[1] >> qb[1] >> qc[1];
col[0] = -1;
col[1] = -1;
col[n] = -1;
f[1] = 1;
for (int i = 2; i < n; i++) {
col[i] = -1;
f[i] = i;
qa[i] = (1LL * qa[i - 1] * i) % n;
qb[i] = (1LL * qb[i - 1] * i) % n;
qc[i] = (1LL * qc[i - 1] * i) % n;
}
int cnt = 0;
for (int i = n - 1; i >= 1; i--) {
int x, y;
for (x = max(1, min(qa[i], qb[i])), y = max(qb[i], qa[i]); x < y; ) {
if (col[x] == -1) {
col[x] = qc[i];
if (++cnt == n - 1)
break;
}
if (col[x - 1] != -1)
unite(find_root(x - 1), find_root(x));
x = find_root(x) + 1;
}
if (x == y) {
if (col[x] == -1)
col[x] = qc[i], ++cnt;
if (col[x - 1] != -1)
unite(find_root(x - 1), find_root(x));
if (col[x + 1] != -1)
unite(find_root(x), find_root(x + 1));
}
if (cnt == n - 1)
break;
}
for (int i = 1; i < n; i++) {
if (col[i] == -1)
col[i] = 0;
printf("%d\n", col[i]);
}
return 0;
}