Pagini recente » Cod sursa (job #3184884) | Cod sursa (job #2334810) | Cod sursa (job #3227478) | Cod sursa (job #2862359) | Cod sursa (job #1227951)
#include <iostream>
using namespace std;
int n,a,b,c;
unsigned int C[10001];
unsigned short int bucket[10000001][3];
unsigned short int B[10000001][3];
void fill_buckets(int k, int nr){
bucket[k][0] = nr % 10000;
bucket[k][1] = (nr % 100000000 - bucket[k][0]) / 10000;
bucket[k][2] = (nr - bucket[k][1] * 10000 - bucket[k][0]) / 100000000;
}
void create_buckets(){
int nr;
nr = b;
fill_buckets(0,nr);
for(int i = 1; i < n; i++){
nr = (int)(((long long)a * (long long)nr + (long long)b) % (long long)c);
fill_buckets(i,nr);
}
}
void counting_sort(int d){
for(int i = 0; i < 10000; i++)
C[i] = 0;
for(int i = 0; i < n; i++)
C[bucket[i][d]]++;
for(int i = 1; i < 10000; i++)
C[i] += C[i - 1];
for(int i = n - 1; i >= 0; i--){
int j = bucket[i][d];
B[C[j] - 1][d] = j;
for(int k = 0; k < 3; k++)
if(k != d)
B[C[j] - 1][k] = bucket[i][k];
C[j] --;
}
for(int i = 0; i < n; i++)
for(int j = 0; j < 3; j++)
bucket[i][j] = B[i][j];
}
int main(){
freopen("radixsort.in","r",stdin);
freopen("radixsort.out","w",stdout);
scanf("%d%d%d%d",&n,&a,&b,&c);
create_buckets();
int i,nr;
for(i = 0; i < 3; i++)
counting_sort(i);
for(i = 0; i < n; i += 10){
nr = bucket[i][2] * 100000000 + bucket[i][1] * 10000 + bucket[i][0];
printf("%d ",nr);
}
return 0;
}