Cod sursa(job #2586026)

Utilizator Rares31100Popa Rares Rares31100 Data 19 martie 2020 17:02:30
Problema Radix Sort Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.08 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[10000],apar[10000],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*=10000)
    {
        for(UI j=0;j<=9999;j++)
            last[j]=apar[j]=0;
        nr=0;

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

        UI poz=0;
        for(UI cif=0;cif<=9999;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;
}