Cod sursa(job #3313372)

Utilizator DobraVictorDobra Victor Ioan DobraVictor Data 3 octombrie 2025 21:11:01
Problema Radix Sort Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.06 kb
#include <iostream>
#include <fstream>
#include <stdint.h>
#include <limits.h>

const uint32_t MAX_N = 10000000;

uint32_t vec[MAX_N], temp[MAX_N];

int main() {
	std::ifstream fin("radixsort.in");
	std::ofstream fout("radixsort.out");

	uint32_t n, a, b, c;
	fin >> n >> a >> b >> c;

	vec[0] = b;
	for(uint32_t i = 1; i != n; ++i) {
		uint64_t res = (uint64_t)a * vec[i - 1] + b;
		res %= c;
		vec[i] = (uint32_t)res;
	}

	for(uint32_t bit = 0; bit != 32; ++bit) {
		uint32_t frec[256];
		for(uint32_t i = 0; i != 256; ++i)
			frec[i] = 0;

		for(uint32_t i = 0; i != n; ++i) {
			uint32_t word = (vec[i] >> bit) & 255;
			++frec[word];
		}

		frec[255] = n - frec[255];
		for(uint32_t i = 254; i != UINT32_MAX; --i)
			frec[i] = frec[i + 1] - frec[i];
		
		for(uint32_t i = 0; i != n; ++i) {
			uint32_t word = (vec[i] >> bit) & 255;
			temp[frec[word]++] = vec[i];
		}
		for(uint32_t i = 0; i != n; ++i)
			vec[i] = temp[i];
	}

	for(uint32_t i = 0; i < n; i += 10)
		fout << vec[i] << ' ';

	fin.close();
	fout.close();

	return 0;
}