Cod sursa(job #2618338)

Utilizator nicolaefilatNicolae Filat nicolaefilat Data 24 mai 2020 17:56:45
Problema Radix Sort Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.05 kb
#include <iostream>
#include <fstream>
#include <vector>

const int MAX_BUCKET = (1<<8) + 2;
const int MAXN = 10000000 + 1;

using namespace std;

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

vector<int>bucket[MAX_BUCKET];
int n,a,b,c,v[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;
    }

    for(int i = 1; i <= n; i++){
        int u8 = v[i] & ((1<<8) - 1);
        bucket[u8].emplace_back(v[i]);
    }
    int index = 0;
    for(int i = 0; i <= (1<<8); i++){
        for(int j = 0; j < bucket[i].size(); j++){
            int nr = bucket[i][j];
            v[++index] = nr;
        }
        bucket[i].clear();
    }
    for(int i = 1; i <= n; i++){
        int primii16 = (1<<8) - 1;
        int p16 = (v[i] & (primii16<<8));
        if(p16 > 0)
            p16 >>= 8;
        bucket[p16].emplace_back(v[i]);
    }
    index = 0;

    for(int i = 0; i <= (1<<8); i++){
        for(int j = 0; j < bucket[i].size(); j++){
            int nr = bucket[i][j];
            v[++index] = nr;
        }
        bucket[i].clear();
    }

    for(int i = 1; i <= n; i++){
        int primii16 = (1<<8) - 1;
        int p16 = (v[i] & (primii16<<16));
        if(p16 > 0)
            p16 >>= 16;
        bucket[p16].emplace_back(v[i]);
    }
    index = 0;
    for(int i = 0; i <= (1<<8); i++){
        for(int j = 0; j < bucket[i].size(); j++){
            int nr = bucket[i][j];
            v[++index] = nr;
        }
        bucket[i].clear();
    }
    for(int i = 1; i <= n; i++){
        int primii16 = (1<<8) - 1;
        int p16 = (v[i] & (primii16<<24));
        if(p16 > 0)
            p16 >>= 24;
        bucket[p16].emplace_back(v[i]);
    }
    index = 0;
    for(int i = 0; i <= (1<<8); i++){
        for(int j = 0; j < bucket[i].size(); j++){
            int nr = bucket[i][j];
            v[++index] = nr;
        }
    }
    for(int i = 1; i <= n; i += 10)
        out<<v[i]<<" ";

    return 0;
}