Cod sursa(job #1446848)

Utilizator mouse_wirelessMouse Wireless mouse_wireless Data 2 iunie 2015 23:27:23
Problema Radix Sort Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include <cstdio>
#include <cassert>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
#define _submit
#ifdef _submit
#define InFile "radixsort.in"
#define OtFile "radixsort.out"
#else
#define InFile "fis.in"
#define OtFile "fis.out"
#endif

#define MAXN 10000010
typedef unsigned long long ULL;
typedef unsigned int uint;

uint v[MAXN];
uint N, A, B, C;

void makeVect() {
	v[0] = B;
	for (uint i = 1; i < N; i++) {
		ULL tmp = ULL(A)*ULL(v[i - 1]) + ULL(B);
		tmp %= ULL(C);
		v[i] = uint(tmp);
	}
}

void radixSort(uint base) {
	vector< queue<int> > buckets(base);
	uint p = 1;
	bool found;
	do {
		found = false;
		if (!p)
			return;
		for (uint i = 0; i < N; i++) {
			uint tmp = v[i] / p;
			if (tmp)
				found = true;
			tmp %= base;
			buckets[tmp].push(v[i]);
		}
		int curIndex = 0;
		for (auto i = buckets.begin(); i != buckets.end(); ++i)
		while (!i->empty()) {
			v[curIndex++] = i->front();
			i->pop();
		}
		p *= base;
	} while (found);
}

int main() {
	assert(freopen(InFile, "r", stdin));
	assert(freopen(OtFile, "w", stdout));
	scanf("%u%u%u%u", &N, &A, &B, &C);
	makeVect();
	radixSort(0xFF + 1);
	for (uint i = 0; i < N; i += 10)
		printf("%d ", v[i]);
	return 0;
}