Pagini recente » Cod sursa (job #1155960) | Cod sursa (job #1115042) | Cod sursa (job #3137697) | Cod sursa (job #1324867) | Cod sursa (job #1199439)
#include <stdio.h>
#define MAXN 10000000
#define BYTE 8
int v[ MAXN + 1 ], next[ MAXN + 1 ], prim;
void rsort( int n ){
long long shift;
int mask = ( 1 << BYTE ) - 1, x, last, i;
int ult[ 1 << BYTE ], pr[ 1 << BYTE ];
for ( shift = 0; shift < 4 * BYTE; shift += BYTE ){
for ( i = 0; i < ( 1 << BYTE ); i++ ){
ult[ i ] = 0;
pr[ i ] = 0;
}
for( i = prim; i <= n; i = next[ i ] ){
x = ( v[ i ] >> shift ) & mask;
if ( ult[ x ] == 0 ) pr[ x ] = i;
next[ ult[ x ] ] = i;
ult[ x ] = i;
}
last = 0;
prim = -1;
for ( i = 0; i < ( 1 << BYTE ); i++ ){
if ( pr[ i ] != 0 ){
if ( prim == -1 ) prim = pr[ i ];
next[ last ] = pr[ i ];
last = ult[ i ];
}
}
next[ last ] = n + 1;
}
return ;
}
int main()
{
FILE *in = fopen ( "radixsort.in", "r" );
int n, a, b, c;
fscanf ( in, "%d%d%d%d", &n, &a, &b, &c );
fclose ( in );
int i;
v[ 1 ] = b;
prim = 1;
for ( i = 2; i <= n; i++ ){
v[ i ] = ( ( long long )v[ i - 1 ] * ( long long )a + ( long long )b ) % c;
next[ i ] = i + 1;
}
next[ 1 ] = 2;
rsort( n );
FILE *out = fopen ( "radixsort.out", "w" );
int poz = prim;
for ( i = 1; i <= n; i++ ){
if ( i % 10 == 1 ){
fprintf ( out, "%d ", v[ poz ] );
}
poz = next[ poz ];
}
fclose ( out );
return 0;
}