Pagini recente » Cod sursa (job #2556985) | Cod sursa (job #2225990) | Cod sursa (job #2470007) | Cod sursa (job #158090) | Cod sursa (job #2608743)
#include <fstream>
using namespace std;
const int N = 1e7;
const int NB = 11;
const int B = 1 << NB;
const int NC = 3;
int n, ans[2][N], nr[B], poz[B];
void upd(int ic, int ia, int nsh);
void innit(int k, int &ic, int &ia, int &nsh);
int main()
{
freopen("radixsort.in","r",stdin);
freopen("radixsort.out","w",stdout);
int aa, b, c;
scanf("%d %d %d %d",&n,&aa,&b,&c);
ans[0][0] = b;
for (int i = 1; i < n; i++){
ans[0][i] = ((long long)aa * ans[0][i-1] + b) % c;
}
for (int k = 0; k < NC; k++){
int ic;
int ia;
int nsh;
innit(k, ic, ia, nsh);
for (int j = 0; j < B; j++)
{
nr[j] = 0;
}
for (int i = 0; i < n; i++){
nr[(ans[ic][i] >> nsh) & (B - 1)]++;
}
poz[0] = 0;
upd(ic, ia, nsh);
}
int ic = NC & 1;
for (int i = 0; i < n; i += 10)
{
printf("%d ",ans[ic][i]);
}
return 0;
}
void innit(int k, int &ic, int &ia, int &nsh) {
ic= k & 1;
ia= 1 - ic;
nsh= k * NB;
}
void upd(int ic, int ia, int nsh) {
for (int j = 1; j < B; j++){
poz[j] = poz[j-1] + nr[j-1];
}
for (int i = 0; i < n; i++){
int cif = (ans[ic][i] >> nsh) & (B - 1);
ans[ia][poz[cif]++] = ans[ic][i];
}
}