Cod sursa(job #1493383)

Utilizator andru47Stefanescu Andru andru47 Data 29 septembrie 2015 11:06:29
Problema Radix Sort Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.54 kb
#include <cstdio>
#include <cstring>
#define NMAX 10000005
#define cifmax 15
using namespace std;
int n,a,b,c,v[NMAX],next[cifmax],last[cifmax],prim[cifmax],temp[NMAX],x,i,j,div;
int main()
{
    freopen("radixsort.in","r",stdin);
    freopen("radixsort.out","w",stdout);
    scanf("%d %d %d %d\n",&n,&a,&b,&c);
    //scanf("%d",&n);
    for (i=1; i<=n; i++)
    {
        if (i==1)v[i]=b;
        else v[i]=(v[i-1]*a+b)%c;
        //scanf("%d",&v[i]);
    }
    //memcpy(temp,v,sizeof(v));
    for (div=1; div<=1000000000; div*=10)
    {
        memset(next,0,sizeof(next));
        memset(last,0,sizeof(last));
        memset(prim,0,sizeof(prim));
        for (i=0; i<=9; i++)
        {
            for (j=1; j<=n; j++)
                if ((v[j]/div)%10==i)
                {
                    if (prim[i]==0)prim[i]=j , last[i]=j;
                    else next[last[i]]=j,last[i]=j;
                }
        }
        j=0;
        for (i=0; i<=9; i++)
            if (prim[i]==last[i]&&prim[i]!=0)temp[++j]=v[prim[i]];
            else if (prim[i]!=last[i])
            {
                temp[++j]=v[prim[i]];
                x=prim[i];
                while(next[x]!=0&&j<=n)
                {
                    temp[++j]=v[next[x]];
                    x=next[x];
                }
                if (x>0&&x<=n&&temp[j]!=v[x])temp[++j]=v[x];
            }
        for (j=1;j<=n;j++)
            v[j]=temp[j];
    }
    for (i=1; i<=n; i+=10)
        printf("%d ",temp[i]);
    printf("\n");
    return 0;
}