Cod sursa(job #1313575)

Utilizator radu_voroneanuVoroneanu Radu Stefan radu_voroneanu Data 10 ianuarie 2015 20:49:47
Problema Radix Sort Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 0.94 kb
#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;
}