Cod sursa(job #1887085)

Utilizator DanielRusuDaniel Rusu DanielRusu Data 21 februarie 2017 12:40:31
Problema Radix Sort Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#include <iostream>
#include <cstdio>
#include <vector>

using namespace std;

#define DIM 10000004

int V[DIM];

int main() {
    freopen("radixsort.in","r",stdin);
    freopen("radixsort.out","w",stdout);

    int N, A, B, C;
    scanf("%d %d %d %d\n", &N, &A, &B, &C);
    V[1] = B % C;
    int mx = V[1];
    for(int i = 2; i <= N; ++i) {
        V[i] = (1LL * A * V[i - 1] + B) % C;

        if(mx < V[i]) {
            mx = V[i];
        }
    }

    int j = 1;
    for(int i = 1; mx / i >= 2; i *= 2) {
        j = i * 2;

        vector <int> first, second;

        for(int k = 1; k <= N; ++k) {
            if(V[k] & i) {
                second.push_back(V[k]);
            }
            else {
                first.push_back(V[k]);
            }
        }

        for(unsigned int k = 0; k < first.size(); ++k) {
            V[k + 1] = first[k];
        }

        for(unsigned int k = 0; k < second.size(); ++k) {
            V[k  + 1 + first.size()] = second[k];
        }
    }

    vector <int> first, second;

    for(int k = 1; k <= N; ++k) {
        if(V[k] & j) {
            second.push_back(V[k]);
        }
        else {
            first.push_back(V[k]);
        }
    }

    for(unsigned int i = 0; i < first.size(); ++i) {
        cout << first[i] << ' ';
    }

    for(unsigned int i = 0; i < second.size(); ++i) {
        cout << second[i] << ' ';
    }

    cout << '\n';

    return 0;
}