Pagini recente » Clasamentul arhivei de probleme | Cod sursa (job #2789714) | Cod sursa (job #3267420) | Cod sursa (job #1721693) | Cod sursa (job #2679834)
#include <stdio.h>
#include <string.h>
#define NMAXX 10000000
#define MAXBIT 32
#define STEP 8
#define PUT 256
using namespace std;
int n, v[2][NMAXX], f[PUT], poz[PUT];
int main()
{
FILE *fin, *fout;
int a, b, c, i, aux, bit, p, p2;
fin = fopen( "radixsort.in", "r" );
fout = fopen( "radixsort.out", "w" );
fscanf( fin, "%d%d%d%d", &n, &a, &b, &c );
v[0][0] = b;
for ( i = 1; i < n; i++ ) {
v[0][i] = ((long long)a * v[0][i - 1] + b) % c;
}
p = 0;
p2 = 1;
for( bit = 0; bit < MAXBIT; bit += STEP ) {
memset( f, 0, sizeof(f) );
for ( i = 0; i < n; i++ ) {
aux = v[p][i] >> bit & (PUT - 1);
f[aux]++;
}
poz[0] = 0;
for ( i = 1; i < PUT; i++ ) {
poz[i] = poz[i - 1] + f[i - 1];
}
for ( i = 0; i < n; i++ ) {
aux = v[p][i] >> bit & (PUT - 1);
v[p2][poz[aux]] = v[p][i];
poz[aux]++;
}
p2 = p;
p = ( p + 1 ) % 2;
}
for ( i = 0; i < n; i += 10 ) {
fprintf( fout, "%d ", v[0][i] );
}
fclose( fin );
fclose( fout );
return 0;
}