Cod sursa(job #1112324)

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

using namespace std;

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

ifstream fin(InFile);
FILE *fout=fopen(OutFile,"w");

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;
    }

    for(register int i=1;i<=N;++i)
    {
        ++F[V[i]&MASK];
    }
    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]--]=V[i];
    }
    memset(F,0,sizeof(F));
    memcpy(V,Buffer,sizeof(int)*(N+2));

    for(register int i=1;i<=N;++i)
    {
        ++F[(V[i]>>LogRadix)&MASK];
    }
    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]>>LogRadix)&MASK]--]=V[i];
    }

    for(register int i=1;i<=N;i+=10)
    {
        fprintf(fout,"%d ",Buffer[i]);
    }
    fclose(fout);
    return 0;
}