Cod sursa(job #1338223)

Utilizator Theodor1000Cristea Theodor Stefan Theodor1000 Data 9 februarie 2015 21:17:53
Problema Radix Sort Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 0.85 kb
#include <cstdio>
#include <queue>

#define M (1 << 16)

using namespace std;

int vv[10000010];
queue <int> q[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 += 16)
    {
        for (int i = 1; i <= n; ++i)
            q[(vv[i] >> h) & (M - 1)].push (vv[i]);

        int k = 0;
        for (int i = 0; i < M; ++i)
            while (!q[i].empty ())
            {
                vv[++k] = q[i].front ();
                q[i].pop ();
            }
    }

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

    printf ("\n");

    return 0;
}