Pagini recente » Cod sursa (job #1715356) | Cod sursa (job #1249488) | Cod sursa (job #1386063) | Cod sursa (job #2701416) | Cod sursa (job #2611780)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("radixsort.in");
ofstream fout("radixsort.out");
const int NMAX = 10000000;
const int NB = 8;
const int BASE = (1<<NB);
int v[2][NMAX + 1];
int nr[BASE + 1];
int poz[BASE + 1];
int getMaxdigits( int val ) {
int pow = 1, nr = 0;
while( pow < val )
pow = pow * BASE, nr ++;
return nr;
}
int main() {
ios::sync_with_stdio(false);
cout.tie(0);
int n, a, b, c;
fin>>n>>a>>b>>c;
v[0][1] = b;
int maxim = b;
for( int i = 2; i <= n; i ++ )
v[0][i] = ((long long)(a * v[0][i-1]) + b) % c, maxim = max(maxim, v[0][i]);
int nc = getMaxdigits(maxim);
int m = BASE - 1;
for( int k = 0; k < nc; k ++ ) {
int l1 = k & 1;
int l2 = (k + 1) & 1;
int nb = k * NB;
for( int j = 0; j < BASE; j ++ )
nr[j] = 0;
for( int i = 1; i <= n; i ++ ) {
int cif = (v[l1][i]>>nb)&m;
nr[cif] ++;
}
poz[0] = 1;
for( int j = 1; j < BASE; j ++ ) {
poz[j] = poz[j - 1] + nr[j - 1];
}
for( int i = 1; i <= n; i ++ ) {
int cif = (v[l1][i]>>nb)&m;
v[l2][poz[cif] ++] = v[l1][i];
}
}
int l = nc & 1;
for( int i = 1; i <= n; i +=10 )
fout<<v[l][i]<<" ";
return 0;
}