Pagini recente » Cod sursa (job #777508) | Cod sursa (job #1280912) | Cod sursa (job #2175552) | Cod sursa (job #2196468) | Cod sursa (job #2938945)
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
constexpr size_t LIM = 1e7 + 5;
long long N, A, B, C;
int arr[LIM];
static inline void read() {
ifstream fin("radixsort.in");
fin >> N >> A >> B >> C;
arr[0] = B;
for (int i = 1; i < N; i++)
arr[i] = 1LL * (A * arr[i - 1] + B) % C;
fin.close();
}
static inline void write() {
ofstream fout("radixsort.out");
for (int i = 0; i < N; i += 10)
fout << arr[i] << ' ';
fout.close();
}
static inline void counting_sort(int vec[], int size, int pow, int radix) {
int* output = new int[size];
int* count = new int[radix];
int i;
fill(count, count + radix, 0);
for (i = 0; i < size; i++)
count[(vec[i] / pow) % radix]++;
for (i = 1; i < radix; i++)
count[i] += count[i - 1];
for (i = size - 1; i >= 0; i--) {
int& pos = count[(vec[i] / pow) % radix];
output[pos - 1] = vec[i];
pos--;
}
copy(output, output + size, vec);
delete[] output;
delete[] count;
}
static inline void radix_sort(int vec[], int size, int radix) {
int max_el = 0;
for (int i = 0; i < size; i++)
max_el = max(max_el, vec[i]);
for (int pow = 1; pow <= max_el; pow *= radix)
counting_sort(vec, size, pow, radix);
}
static inline void solve() {
radix_sort(arr, N, 16);
}
int main() {
read();
solve();
write();
return 0;
}