Pagini recente » Cod sursa (job #1585202) | Cod sursa (job #1446848)
#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;
}