Pagini recente » Cod sursa (job #1747155) | Cod sursa (job #2430943) | Istoria paginii runda/lmk_12_vs | Cod sursa (job #2275333) | Cod sursa (job #3302676)
#include <bits/stdc++.h>
using namespace std;
ifstream in("radixsort.in");
ofstream out("radixsort.out");
const int val = 1 << 16; // 2^16
int n, a, b, c, ct;
vector<int> A, B;
int cnt[val], pos[val];
int main() {
in >> n >> a >> b >> c;
A.resize(n);
B.resize(n);
long long x = b;
A[0] = b;
for (int i = 1; i < n; i++) {
x = (1LL * x * a + b) % c;
A[i] = x;
}
// Sortare după cei mai puțin semnificativi 16 biți
memset(cnt, 0, sizeof(cnt));
for (int i = 0; i < n; i++)
cnt[A[i] & (val - 1)]++; // A[i] % 2^16
pos[0] = 0;
for (int i = 1; i < val; i++)
pos[i] = pos[i - 1] + cnt[i - 1];
for (int i = 0; i < n; i++)
B[pos[A[i] & (val - 1)]++] = A[i];
// Sortare după cei mai semnificativi 16 biți
memset(cnt, 0, sizeof(cnt));
for (int i = 0; i < n; i++)
cnt[B[i] >> 16]++;
pos[0] = 0;
for (int i = 1; i < val; i++)
pos[i] = pos[i - 1] + cnt[i - 1];
for (int i = 0; i < n; i++)
A[pos[B[i] >> 16]++] = B[i];
// Afișare
for (int i = 0; i < n; i++)
if (i % 10 == 0)
out << A[i] << " ";
return 0;
}