Cod sursa(job #2618371)

Utilizator nicolaefilatNicolae Filat nicolaefilat Data 24 mai 2020 18:58:26
Problema Radix Sort Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.24 kb
#include <iostream>
#include <fstream>
#include <vector>

const int MAX_BUCKET = (1<<16) + 1,MAXN = 10000003;

using namespace std;

ifstream in("radixsort.in");
ofstream out("radixsort.out");

int n,a,b,c;
int fr[MAX_BUCKET],v[MAXN],ans[MAXN];

int main()
{
    in>>n>>a>>b>>c;
    v[1] = b;
    for(int i = 2; i <= n; i++){
        v[i] = (1ll * a * v[i - 1] + b) % c;
    }
    int lim = (1<<16) - 1;
    for(int i = 1; i <= n; ++i){
        int u8 = v[i] & lim;
        fr[u8]++;
    }
    for(int i = 1; i <= MAX_BUCKET - 1; ++i)
        fr[i] += fr[i - 1];
    for(int i = n; i >= 1; --i){
        int u8 = v[i] & lim;
        ans[fr[u8]] = v[i];
        fr[u8]--;
    }
    for(int i = 0; i < MAX_BUCKET; ++i)
        fr[i] = 0;
    for(int i = 1; i <= n; ++i)
        v[i] = ans[i];
    for(int i = 1; i <= n; ++i){
        int u8 = (v[i] >> 16) & lim;
        fr[u8]++;
    }
    for(int i = 1; i <= MAX_BUCKET - 1; ++i)
        fr[i] += fr[i - 1];
    for(int i = n; i >= 1; --i){
        int u8 = (v[i] >> 16) & lim;
        ans[fr[u8]] = v[i];
        fr[u8]--;
    }
    for(int i = 1; i <= n; ++i)
        v[i] = ans[i];
    for(int i = 1; i <= n; i += 10)
        out<<v[i]<<" ";
    return 0;
}