//3-way radix quicksort
#include <stdio.h>
#define MAXN 10000000
int v[MAXN], mask[4] = {(1 << 8) - 1, (1 << 16) - 1, (1 << 24) - 1, ((1 << 31) - 1) * 2 + 1};
inline int nr(int x, int c){
return (x & mask[c]) >> (8 * c);
}
inline void exch(int a, int b){
int aux;
aux = v[a];
v[a] = v[b];
v[b] = aux;
}
void rsort(int st, int dr, int c){
if(c < 4){
int i = st, j = dr, piv = nr(v[(st + dr) / 2], c), p = st, q = dr;
while(i <= j){
while(nr(v[i], c) < piv)
i++;
while(nr(v[j], c) > piv)
j--;
if(i <= j){
exch(i, j);
if(nr(v[i], c) == piv){
exch(i, p);
p++;
}
if(nr(v[j], c) == piv){
exch(j, q);
q--;
}
i++;
j--;
}
}
if(i - j > 1){
if(v[j + 1] > piv)
i--;
else if(v[j + 1] < piv)
j++;
}
p = st; q = dr;
while(nr(v[p], c) == piv && j > st){
exch(j, p);
p++;
j--;
}
while(nr(v[q], c) == piv && i < dr){
exch(i, q);
q--;
i++;
}
if(st < j)
rsort(st, j, c);
if(i < dr)
rsort(i, dr, c);
if(i + 1 < j - 1)
rsort(i + 1, j - 1, c + 1);
}
}
int main(){
FILE *in = fopen("radixsort.in", "r");
int n, a, b, c, i;
fscanf(in, "%d%d%d%d", &n, &a, &b, &c);
v[0] = b;
for(i = 0; i < n; i++){
v[i] = (a * v[i - 1] + b) % c;
}
fclose(in);
for(i = 3; i >= 1; i--){
mask[i] -= mask[i - 1];
}
rsort(0, n - 1, 0);
FILE *out = fopen("radixsort.out", "w");
for(i = 0; i < n; i += 10)
fprintf(out, "%d ", v[i]);
fclose(out);
return 0;
}