Cod sursa(job #2092097)

Utilizator ArctopusKacso Peter-Gabor Arctopus Data 20 decembrie 2017 23:05:31
Problema Radix Sort Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.6 kb
#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(  ll( 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] << " ";

}