Cod sursa(job #1109868)

Utilizator cosmin79Carabet Cosmin Andrei cosmin79 Data 17 februarie 2014 17:48:49
Problema Radix Sort Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 0.97 kb
#include <cstdio>
#include <algorithm>
#define NMAX 10000005
#define pii pair <int, int>
#define x first
#define y second
#define ll long long
#define LMAX 2
#define HMAX 32
#define pb push_back
using namespace std;
int n, a, b, c, A[NMAX], P[NMAX];
 
vector <int> pos[LMAX];
 
int main()
{
    freopen("radixsort.in", "r", stdin);
    freopen("radixsort.out", "w", stdout);
    scanf("%d%d%d%d", &n, &a, &b, &c);
    A[1] = b; P[1] = 1;
    for (int i = 2; i <= n; i++)
        A[i] = ((ll)A[i - 1] * a + b) % c, P[i] = i;
     
    for (int i = 1, curr = 0; i < HMAX; i++, curr++)
    {
        for (int j = 0; j < LMAX; j++)
            pos[j].clear();
        for (int j = 1; j <= n; j++)
            pos[(A[P[j]] >> curr) & 1].pb(P[j]);
        for (int j = 0, r = 0; j < LMAX; j++)
            for (int k = 0; k < (int)pos[j].size(); k++)
                P[++r] = pos[j][k];
    }
     
    for (int i = 1; i <= n; i += 10)
        printf("%d ", A[P[i]]);
    printf("\n");
    return 0;
}