Cod sursa(job #2608743)

Utilizator alexradu04Radu Alexandru alexradu04 Data 1 mai 2020 18:22:56
Problema Radix Sort Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.28 kb
#include <fstream>

using namespace std;

const int N = 1e7;
const int NB = 11;
const int B = 1 << NB;
const int NC = 3;

int n, ans[2][N], nr[B], poz[B];

void upd(int ic, int ia, int nsh);

void innit(int k, int &ic, int &ia, int &nsh);

int main()
{
    freopen("radixsort.in","r",stdin);
    freopen("radixsort.out","w",stdout);
    int aa, b, c;
    scanf("%d %d %d %d",&n,&aa,&b,&c);
    ans[0][0] = b;
    for (int i = 1; i < n; i++){
        ans[0][i] = ((long long)aa * ans[0][i-1] + b) % c;
    }
    for (int k = 0; k < NC; k++){
        int ic;
        int ia;
        int nsh;
        innit(k, ic, ia, nsh);
        for (int j = 0; j < B; j++)
        {
            nr[j] = 0;
        }
        for (int i = 0; i < n; i++){
            nr[(ans[ic][i] >> nsh) & (B - 1)]++;
        }
        poz[0] = 0;
        upd(ic, ia, nsh);
    }
    int ic = NC & 1;
    for (int i = 0; i < n; i += 10)
    {
        printf("%d ",ans[ic][i]);
    }
    return 0;
}

void innit(int k, int &ic, int &ia, int &nsh) {
    ic= k & 1;
    ia= 1 - ic;
    nsh= k * NB;
}

void upd(int ic, int ia, int nsh) {
    for (int j = 1; j < B; j++){
        poz[j] = poz[j-1] + nr[j-1];
    }
    for (int i = 0; i < n; i++){
        int cif = (ans[ic][i] >> nsh) & (B - 1);
        ans[ia][poz[cif]++] = ans[ic][i];
    }
}