Pagini recente » Cod sursa (job #2081590) | Cod sursa (job #241979) | Cod sursa (job #3254327) | Cod sursa (job #2631294) | Cod sursa (job #1313575)
#include <stdio.h>
#include <algorithm>
using namespace std;
#define MAXN 10000001
int V[MAXN];
int Next[MAXN];
int Copy[MAXN];
int Prim[65536], Last[65536];
int N, A, B, C;
int main()
{
freopen("radixsort.in", "r", stdin);
freopen("radixsort.out", "w", stdout);
scanf("%d %d %d %d", &N, &A, &B, &C);
for (int i = 1; i <= N; ++i)
V[i] = (1LL * V[i - 1] * A + B) % C;
for (int pow = 0; pow <= 31; pow += 16) {
for (int i = 0; i < 65536; ++i)
Prim[i] = Last[i] = 0;
for (int i = 1; i <= N; ++i) {
Next[i] = 0;
int Bucket = (V[i] >> pow) & 65535;
if (Prim[Bucket] == 0)
Prim[Bucket] = Last[Bucket] = i;
else {
Next[Last[Bucket]] = i;
Last[Bucket] = i;
}
}
int Nr = 0;
for (int i = 0; i < 65536; ++i)
while (Prim[i] != 0) {
Copy[++Nr] = V[Prim[i]];
Prim[i] = Next[Prim[i]];
}
for (int i = 1; i <= N; ++i)
V[i] = Copy[i];
}
for (int i = 1; i <= N; i+=10)
printf("%d ", V[i]);
return 0;
}