Cod sursa(job #2938948)

Utilizator rastervcrastervc rastervc Data 12 noiembrie 2022 19:42:20
Problema Radix Sort Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.43 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>

using namespace std;

constexpr size_t LIM = 1e7 + 5;
long long N, A, B, C;
unsigned 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(unsigned int vec[], int size, int pow, int radix) {
	unsigned int* output = new unsigned 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(unsigned int vec[], int size, int radix) {
	unsigned 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;
}