Pagini recente » Cod sursa (job #801250) | Cod sursa (job #3206522) | Cod sursa (job #2386277) | Cod sursa (job #1628862) | Cod sursa (job #1887085)
#include <iostream>
#include <cstdio>
#include <vector>
using namespace std;
#define DIM 10000004
int V[DIM];
int main() {
freopen("radixsort.in","r",stdin);
freopen("radixsort.out","w",stdout);
int N, A, B, C;
scanf("%d %d %d %d\n", &N, &A, &B, &C);
V[1] = B % C;
int mx = V[1];
for(int i = 2; i <= N; ++i) {
V[i] = (1LL * A * V[i - 1] + B) % C;
if(mx < V[i]) {
mx = V[i];
}
}
int j = 1;
for(int i = 1; mx / i >= 2; i *= 2) {
j = i * 2;
vector <int> first, second;
for(int k = 1; k <= N; ++k) {
if(V[k] & i) {
second.push_back(V[k]);
}
else {
first.push_back(V[k]);
}
}
for(unsigned int k = 0; k < first.size(); ++k) {
V[k + 1] = first[k];
}
for(unsigned int k = 0; k < second.size(); ++k) {
V[k + 1 + first.size()] = second[k];
}
}
vector <int> first, second;
for(int k = 1; k <= N; ++k) {
if(V[k] & j) {
second.push_back(V[k]);
}
else {
first.push_back(V[k]);
}
}
for(unsigned int i = 0; i < first.size(); ++i) {
cout << first[i] << ' ';
}
for(unsigned int i = 0; i < second.size(); ++i) {
cout << second[i] << ' ';
}
cout << '\n';
return 0;
}