Pagini recente » Cod sursa (job #545301) | Cod sursa (job #783242) | Cod sursa (job #1150286) | Cod sursa (job #877022) | Cod sursa (job #2618371)
#include <iostream>
#include <fstream>
#include <vector>
const int MAX_BUCKET = (1<<16) + 1,MAXN = 10000003;
using namespace std;
ifstream in("radixsort.in");
ofstream out("radixsort.out");
int n,a,b,c;
int fr[MAX_BUCKET],v[MAXN],ans[MAXN];
int main()
{
in>>n>>a>>b>>c;
v[1] = b;
for(int i = 2; i <= n; i++){
v[i] = (1ll * a * v[i - 1] + b) % c;
}
int lim = (1<<16) - 1;
for(int i = 1; i <= n; ++i){
int u8 = v[i] & lim;
fr[u8]++;
}
for(int i = 1; i <= MAX_BUCKET - 1; ++i)
fr[i] += fr[i - 1];
for(int i = n; i >= 1; --i){
int u8 = v[i] & lim;
ans[fr[u8]] = v[i];
fr[u8]--;
}
for(int i = 0; i < MAX_BUCKET; ++i)
fr[i] = 0;
for(int i = 1; i <= n; ++i)
v[i] = ans[i];
for(int i = 1; i <= n; ++i){
int u8 = (v[i] >> 16) & lim;
fr[u8]++;
}
for(int i = 1; i <= MAX_BUCKET - 1; ++i)
fr[i] += fr[i - 1];
for(int i = n; i >= 1; --i){
int u8 = (v[i] >> 16) & lim;
ans[fr[u8]] = v[i];
fr[u8]--;
}
for(int i = 1; i <= n; ++i)
v[i] = ans[i];
for(int i = 1; i <= n; i += 10)
out<<v[i]<<" ";
return 0;
}