Cod sursa(job #1112334)

Utilizator ChallengeMurtaza Alexandru Challenge Data 19 februarie 2014 18:21:08
Problema Radix Sort Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include <fstream>
#include <cstring>

using namespace std;

const char InFile[]="radixsort.in";
const char OutFile[]="radixsort.out";
const int MaxN=10111000;
const int LogRadix=8;
const int Steps=32/LogRadix;
const int Radix=1<<LogRadix;

ifstream fin(InFile);
ofstream fout(OutFile);

int N,A,B,C,V[MaxN],Buffer[MaxN],F[Radix];

int main()
{
    fin>>N>>A>>B>>C;
    fin.close();

    V[1]=B;
    for(register int i=2;i<=N;++i)
    {
        V[i]=(1LL*A*V[i-1]+1LL*B)%C;
    }

    int mask=Radix-1;
    int p=0;
    for(register int step=1;step<=Steps;++step)
    {
        for(register int i=1;i<=N;++i)
        {
            ++F[(V[i]&mask)>>p];
        }
        for(register int i=1;i<Radix;++i)
        {
            F[i]+=F[i-1];
        }
        for(register int i=N;i>0;--i)
        {
            Buffer[F[(V[i]&mask)>>p]--]=V[i];
        }
        memset(F,0,sizeof(F));
        for(register int i=1;i<=N;++i)
        {
            V[i]=Buffer[i];
        }
        p+=LogRadix;
        mask<<=LogRadix;
    }

    for(register int i=1;i<=N;i+=10)
    {
        fout<<V[i]<<" ";
    }
    fout.close();
    return 0;
}