Cod sursa(job #1494465)

Utilizator danstefanDamian Dan Stefan danstefan Data 1 octombrie 2015 10:00:47
Problema Radix Sort Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb
#include <fstream>
#include <cstdio>
using namespace std;
int prim[11],ultim[11],n,i,k,in,inn,nxt[10000010];
long long a,b,c,v[10000010],temporar[10000010],pr,ma;
int main()
{
    freopen("radixsort.in","r",stdin);
    ofstream g ("radixsort.out");
    scanf("%d%lld%lld%lld",&n,&a,&b,&c);
    v[1]=b;ma=b;
    for(i=2; i<=n; ++i){
           v[i] = (a * v[i-1] + b) % c;
           if(v[i]>ma)ma=v[i];}
    pr=1;
    while(pr<ma)
    {
        k=0;
        for(i=1; i<=n; ++i)
        {
            c=v[i]/pr%10;
            if(prim[c]==0)prim[c]=i;
            if(ultim[c]==0)ultim[c]=i;
            else nxt[ultim[c]]=i,ultim[c]=i;
        }
        for(i=0; i<=9; ++i)
            if(prim[i]==ultim[i]&&prim[i]!=0)temporar[++k]=v[prim[i]];
            else if(prim[i]!=0)
            {
                in=prim[i];
                temporar[++k]=v[in];
                while(nxt[in]!=0)
                {
                    temporar[++k]=v[nxt[in]];
                    inn=nxt[in];
                    nxt[in]=0;
                    in=inn;
                }
            }
        for(i=0; i<=9; ++i)
            prim[i]=0,ultim[i]=0;
        for(i=1; i<=n; ++i)
            v[i]=temporar[i];
        pr*=10;
    }
    for(i=1; i<=n; i+=10)
        g<<v[i]<<" ";
    return 0;
}