Cod sursa(job #1375875)

Utilizator darrenRares Buhai darren Data 5 martie 2015 14:51:35
Problema Radix Sort Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.03 kb
#include <cstring>
#include <fstream>
#include <algorithm>

using namespace std;

int N, A, B, C;
int V[10000002], W[1 << 16], S[1 << 16];
int aux[10000002];

void radix(int x, int y)
{
    int mask = 0;
    for (int i = x; i <= y; ++i)
        mask ^= (1 << i);

    for (int i = 1; i <= N; ++i)
        ++W[(V[i] & mask) >> x];
    for (int i = 0; i < (1 << 16); ++i)
        S[i] = (i == 0 ? 0 : S[i - 1]) + W[i];

    for (int i = N; i >= 1; --i)
    {
        aux[(((V[i] & mask) >> x) == 0 ? 0 : S[((V[i] & mask) >> x) - 1]) + W[(V[i] & mask) >> x]] = V[i];
        --W[(V[i] & mask) >> x];
    }
    memcpy(V, aux, sizeof(V));
}

int main()
{
    ifstream fin("radixsort.in");
    ofstream fout("radixsort.out");

    fin >> N >> A >> B >> C;
    V[1] = B;
    for (int i = 2; i <= N; ++i)
        V[i] = (1LL * A * V[i - 1] + B) % C;

    radix(0, 15);
    radix(16, 30);

    for (int i = 1; i <= N; i += 10)
        fout << V[i] << ' ';
    fout << '\n';

    fin.close();
    fout.close();
}