Pagini recente » Cod sursa (job #2712589) | Cod sursa (job #3041402) | Cod sursa (job #1944774) | Cod sursa (job #2710893) | Cod sursa (job #2092098)
#include <fstream>
#include <iostream>
#include <deque>
#define ll long long
using namespace std;
const int NLIM = 1e7 + 10;
int N, A, B, C;
int v[NLIM];
const int BUCKNR = 70000;
deque< int > buck[BUCKNR];
ll getLastBits( ll a, int l )
{
return ( ( a >> l ) << l );
}
ll getFirstBits( ll a, int l )
{
return a - getLastBits( a, l );
}
ll getBits( ll a, int x, int y )
{
return a - getFirstBits( a, x ) - getLastBits( a, y );
}
ifstream fcin("radixsort.in");
ofstream fcout("radixsort.out");
int main()
{
/*/
cout << getBits( 91, 0, 4 ) << "\n";
cout << getBits( 91, 4, 8 );
cin >> N;
return 0;
//*/
fcin >> N >> A >> B >> C;
// generate input
v[0] = B;
for( int i = 1; i < N; ++i )
{
v[i] = ( v[i - 1] * A + B ) % C;
//cout << v[i] << " ";
}
//cout << "\n";
int NR = 2;
int BYTES = 16;
for( int i = 0; i < NR; ++i )
{
//cout << i << "\n";
// counting sort:
for( int j = 0; j < N; ++j )
{
//if( j % 100000 == 0 )
//{
// cout << j << "\n";
// cout << i << " " << j << "\n";
//}
int x = getBits( v[j] , i * BYTES, ( i + 1 ) * BYTES );
x = x >> ( BYTES * i );
//if( j % 100000 == 0 )
//{
// cout << "$uicide: " << x << "\n";
//}
buck[x].push_back( v[j] );
}
int vi = 0;
// get the numbers from the buckets:
for( int j = 0; j < BUCKNR; ++j )
{
while( buck[j].size() )
{
v[vi] = buck[j].front(); ++vi;
buck[j].pop_front();
}
}
}
for( int i = 0; i < N; ++i )
if( i % 10 == 0 )
fcout << v[i] << " ";
}