Cod sursa(job #1493382)

Utilizator vladdy47Bucur Vlad Andrei vladdy47 Data 29 septembrie 2015 10:53:56
Problema Radix Sort Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
# include <cstdio>
# define MAX 10000010

using namespace std;

int prim[15], ultm[15];
int a[MAX], next[MAX], aux[MAX];
int  n, M, c, i, j;
long long div, A, B, C;

// next -> prim[c] -> ultm[c]

void finish(){
    int j;
    for (j = 1; j <= n; j++)
        a[j] = aux[j];
    for (j = 0; j <= 9; j++)
       aux[j] = prim[j] = ultm[j] = next[j] = 0;
}
int main ()

{
    freopen("radixsort.in","r",stdin);
    freopen("radixsort.out","w",stdout);

    scanf("%d %lld %lld %lld", &n, &A, &B, &C);
    a[1] = B;
    for (i = 2; i <= n; i++)
        a[i] = (A * a[i-1] + B) % C;

    div = 1;
    for (i = 0; i <= 9; i++)
    {
        for (j = 1; j <= n; j++)
        {
            if (prim[(a[j] / div) % 10] == 0) prim [(a[j] / div) % 10] = j, ultm [(a[j] / div) % 10] = j;
            else
            {
                next[ultm[(a[j] / div) % 10]] = j;
                ultm[(a[j] / div) % 10] = j;
            }
        }
        M = 0;
        for (c = 0; c <= 9; c++)
        {
            if (prim[c] != 0)
            {
                for (j = prim[c]; j < ultm[c]; j = next[j])
                    aux[++M] = a[j];
                aux[++M] = a[ultm[c]];
            }
        }
        finish();

    div *= 10;
    }

    for (i = 1; i <= n; i+=10)
        printf("%d ",a[i]);
    return 0;
}