Cod sursa(job #1417419)

Utilizator Theodor1000Cristea Theodor Stefan Theodor1000 Data 10 aprilie 2015 12:13:41
Problema Radix Sort Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.1 kb
#include <cstdio>
#include <algorithm>

#define M (1 << 23)

using namespace std;

int vv[10000010], q[10000010], nr[M];

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);

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

    for (int h = 0; h < 32; h += 23)
    {
        for (int i = 0; i < M; ++i)
            nr[i] = 0;

        for (int i = 1; i <= n; ++i)
        {
            int x = (vv[i] >> h) & (M - 1);
            ++nr[x];
        }

        for (int i = 1; i < M; ++i)
            nr[i] += nr[i - 1];

        int k = 0;
        for (int i = 1; i <= n; ++i)
        {
            int x = (vv[i] >> h) & (M - 1);
            if (!x) q[++k] = vv[i];
            else q[++nr[x - 1]] = vv[i];
        }

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

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

    printf ("\n");

    return 0;
}