Pagini recente » Cod sursa (job #3235119) | Cod sursa (job #1907081) | Borderou de evaluare (job #202964) | Cod sursa (job #3264213) | Cod sursa (job #2618358)
#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;
int poz = fr[u8];
ans[poz] = v[i];
fr[u8]--;
}
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;
int poz = fr[u8];
ans[poz] = 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;
}