//3-way radix quicksort
#include <stdio.h>
#define MAXN 10000000
#define MASK ((1 << 8) - 1)
#define AFIS 10
int v[MAXN];
inline int nr(int x, int c){
return (x >> (8 * c)) & MASK;
}
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 > -1){
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 > p){
exch(j, p);
p++;
j--;
}
while(nr(v[j], c) == piv && j >= st)
j--;
while(nr(v[q], c) == piv && i < q){
exch(i, q);
q--;
i++;
}
while(nr(v[i], c) == piv && i <= dr)
i++;
if(st < j)
rsort(st, j, c);
if(i < dr)
rsort(i, dr, c);
if(j + 1 < i - 1)
rsort(j + 1, i - 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);
rsort(0, n - 1, 3);
FILE *out = fopen("radixsort.out", "w");
fprintf(out, "%d", v[0]);
for(i = AFIS; i < n; i += AFIS)
fprintf(out, " %d", v[i]);
fclose(out);
return 0;
}