Cod sursa(job #2586028)

Utilizator Rares31100Popa Rares Rares31100 Data 19 martie 2020 17:05:14
Problema Radix Sort Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.09 kb
#include <bits/stdc++.h>
#define ULL unsigned long long
#define UI unsigned int

using namespace std;

ifstream in("radixsort.in");
ofstream out("radixsort.out");

UI n;
UI sir[10000001],maxim;
ULL P,Val,Add,Mod;
UI vf[10000001],urm[10000001],last[1000000],apar[1000000],nr;

void adauga(int cif,int val)
{
    vf[++nr]=val;
    urm[nr]=last[cif];
    last[cif]=nr;
    apar[cif]++;
}

int main()
{
    in>>n>>P>>Add>>Mod;

    sir[1]=Add;

    for(UI i=2;i<=n;i++)
    {
        Val=sir[i-1];
        sir[i]=(P*Val+Add)%Mod;

        maxim=max(maxim,sir[i]);
    }

    for(UI exp=1;maxim/exp;exp*=1000000)
    {
        for(UI j=0;j<=999999;j++)
            last[j]=apar[j]=0;
        nr=0;

        for(UI j=1;j<=n;j++)
            adauga( sir[j]/exp%1000000 , sir[j] );

        UI poz=0;
        for(UI cif=0;cif<=999999;cif++)
        {
            for(UI k=last[cif],l=0;k;k=urm[k],l++)
                sir[poz+apar[cif]-l]=vf[k];

            poz+=apar[cif];
        }
    }

    for(UI i=1;i<=n;i+=10)
        out<<sir[i]<<' ';

    return 0;
}