Cod sursa(job #1842883)

Utilizator zdavid112zIon David-Gabriel zdavid112z Data 7 ianuarie 2017 18:44:20
Problema Radix Sort Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.54 kb
#include <cstdio>
#define NMAX 10000003
#define grupa(nr, step) ((nr >> step) & 15)

using namespace std;
typedef long long int64;

int64* s[2][16];
int64 ls[2][16];
int64 n, a, b, c;
int64 pc = 0, lc = 0, *vc, indc = -1;
int64 mc = 1, mp;

inline void next(int64& val)
{
    while(pc == lc)
    {
        vc = s[mp][++indc];
        lc = ls[mp][indc];
        pc = 0;
    }
    val = vc[pc++];
}

int main()
{
    int64 i, gr = 0, aux, prev;
    freopen("radixsort.in", "r", stdin);
    freopen("radixsort.out", "w", stdout);
    scanf("%lld%lld%lld%lld", &n, &a, &b, &c);
    for(i = 0; i < 16; i++)
    {
        s[0][i] = new int64[n + 3];
        s[1][i] = new int64[n + 3];
    }
    prev = b;
    s[0][prev & 15][ls[0][prev & 15]++] = prev;
    //printf("%d ", prev);
    for(i = 1; i < n; i++)
    {
        aux = (a * prev + b) % c;
        //printf("%d ", aux);
        s[0][aux & 15][ls[0][aux & 15]++] = aux;
        prev = aux;
    }
    //printf("\n");
    for(gr = 4; gr != 36; gr += 4)
    {
        for(i = 0; i < 16; i++) ls[mc][i] = 0;
        for(i = 0; i < n; i++)
        {
            next(aux);
            s[mc][grupa(aux, gr)][ls[mc][grupa(aux, gr)]++] = aux;
        }
        pc = 0; lc = 0; indc = -1;
        mc = mp;
        mp = (mp == 1) ? 0 : 1;
    }
    mp = mc;
    for(i = 0; i < n; i++)
    {
        next(aux);
        if(i % 10 == 0) printf("%lld ", aux);
    }
    for(i = 0; i < 16; i++)
    {
        delete[] s[0][i];
        delete[] s[1][i];
    }
    return 0;
}