Pagini recente » Cod sursa (job #2358635) | Cod sursa (job #897618) | Cod sursa (job #2239515) | Cod sursa (job #418995) | Cod sursa (job #2351524)
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
#define N_SYS 8388608
ifstream fin("radixsort.in");
ofstream fout("radixsort.out");
long long n, a, b, c;
int v[10000000];
int r[10000000];
int x[N_SYS];
int *vp, *rp, *ch;
int digits;
void read() {
fin >> n >> a >> b >> c;
}
void generate() {
int mx = 0;
v[0] = b;
for (int i = 1; i < n; i++) {
v[i] = (a*v[i - 1] + b) % c;
if (v[i] > mx) mx = v[i];
}
vp = v;
rp = r;
while (mx != 0) {
digits++;
mx /= N_SYS;
}
}
void sort2() {
int dv = 1, t;
for (int j = 1; j <= digits; j++) {
for (int i = n - 1; i >= 0; i--) {
x[(vp[i]/dv)% N_SYS]++;
}
for (int i = 1; i < N_SYS; i++) {
x[i] += x[i - 1];
}
for (int i = n - 1; i >= 0; i--) {
t = (vp[i] / dv) % N_SYS;
x[t]--;
rp[x[t]] = vp[i];
}
for (int i = 1; i < N_SYS; i++) {
x[i] = 0;
}
dv *= N_SYS;
ch = rp;
rp = vp;
vp = ch;
}
}
void write() {
int* m = vp + n;
for (int *i = vp; i < m; i += 10) {
fout << *i << " ";
}
}
int main() {
read();
generate();
sort2();
write();
return 0;
}