Cod sursa(job #1493126)

Utilizator Theodor1000Cristea Theodor Stefan Theodor1000 Data 28 septembrie 2015 19:08:25
Problema Radix Sort Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 kb
#include <cstdio>
#include <algorithm>

using namespace std;

long long v[10000010], vv[10000010];
int prim[16], ultim[16], nxt[10000010];

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

    int n;
    long long a, b, c;
    scanf ("%d %lld %lld %lld", &n, &a, &b, &c);

    v[1] = b;
    for (int i = 2; i <= n; ++i)
        v[i] = (1LL * v[i - 1] * a + b) % c;

    int p = 1;
    for (; p <= 1000000000; p *= 10)
    {
        for (int i = 1; i <= n; ++i)
        {
            int x = (1LL * v[i] / p) % 10;

            if (!prim[x]) prim[x] = i;
            else nxt[ultim[x]] = i;

            ultim[x] = i;
        }

        int k = 0;
        for (int i = 0; i < 10; ++i)
        {
            for (int j = prim[i]; j < ultim[i]; j = nxt[j])
                vv[++k] = v[j];

            if (ultim[i]) vv[++k] = v[ultim[i]];
            prim[i] = ultim[i] = 0;
        }

        for (int i = 1; i <= n; ++i)
            v[i] = vv[i];
    }

    for (int i = 1; i <= n; i += 10)
        printf ("%lld ", v[i]);

    printf ("\n");

    return 0;
}