Pagini recente » Cod sursa (job #2231853) | Cod sursa (job #2181787) | Cod sursa (job #1815858) | Cod sursa (job #1939938) | Cod sursa (job #1823876)
#include <cstdio>
const int MAX_N = 10000000;
int v[1+MAX_N], next[1+MAX_N], vc[1+MAX_N];
const int BUCKET = 1 << 16;
int start[BUCKET], last[BUCKET];
void split(int n, int e) {
int byte, top;
for(int i = 0; i < BUCKET; ++i)
start[i] = 0;
for(int i = 1; i <= n; ++i) {
byte = (v[i] >> (16 * e)) & ((1 << 16) - 1);
vc[i] = v[i];
next[i] = 0;
if(start[byte] == 0)
start[byte] = last[byte] = i;
else
last[byte] = next[last[byte]] = i;
}
top = 1;
for(int i = 0; i < BUCKET; ++i) {
int j = start[i];
while(j != 0) {
v[top] = vc[j];
++top;
j = next[j];
}
}
}
int main() {
int n, a, b, c;
FILE *fin = fopen("radixsort.in", "r");
fscanf(fin, "%d%d%d%d", &n, &a, &b, &c);
fclose(fin);
v[1] = b;
for(int i = 2; i <= n; ++i)
v[i] = ((long long)a * v[i - 1] + b) % c;
for(int i = 0; i < 2; ++i)
split(n, i);
FILE *fout = fopen("radixsort.out", "w");
for(int i = 1; i <= n; i = i + 10)
fprintf(fout, "%d ", v[i]);
fclose(fout);
return 0;
}