Pagini recente » Cod sursa (job #1186843) | Cod sursa (job #619849) | Cod sursa (job #1650191) | Cod sursa (job #2940176) | Cod sursa (job #2618847)
#include <cstdio>
#include <vector>
#include <fstream>
#include <cstring>
using namespace std;
const int NMAX = 10000505;
const int LMAX = (1 << 8);
int N, A, B, C;
int nums[2][NMAX];
int sliceStart[LMAX], cntByte[LMAX];
inline int getValue(int& value, int from, int toExclusive) {
long long temp = ((1LL << toExclusive) - 1) & value;
return temp >> from;
}
int main() {
ifstream in("radixsort.in");
ofstream out("radixsort.out");
in >> N >> A >> B >> C;
nums[0][1] = B;
for (int idx = 2; idx <= N; idx++) {
nums[0][idx] = (1LL * nums[0][idx - 1] * A + B) % C;
}
for (int byteIdx = 0; byteIdx < 4; byteIdx++) {
memset(cntByte, 0, sizeof(cntByte));
int currMod2 = byteIdx & 1, nextMod2 = (byteIdx + 1) & 1;
for (int idx = 1; idx <= N; idx++) {
int byteValue = getValue(nums[currMod2][idx], byteIdx * 8, (byteIdx + 1) * 8);
cntByte[byteValue]++;
}
sliceStart[0] = 1;
for (int value = 1; value < LMAX; value++) {
sliceStart[value] = sliceStart[value - 1] + cntByte[value - 1];
}
for (int idx = 1; idx <= N; idx++) {
int byteValue = getValue(nums[currMod2][idx], byteIdx * 8, (byteIdx + 1) * 8);
nums[nextMod2][sliceStart[byteValue]++] = nums[currMod2][idx];
}
}
for (int idx = 1; idx <= N; idx += 10) {
out << nums[0][idx] << " ";
}
out << "\n";
return 0;
}