Cod sursa(job #2391590)

Utilizator romircea2010FMI Trifan Mircea Mihai romircea2010 Data 29 martie 2019 00:18:48
Problema Radix Sort Scor 100
Compilator cpp-32 Status done
Runda Arhiva educationala Marime 1.36 kb
#include <fstream>
#include <queue>
 
using namespace std;
 
const int NMax = 10000010;
const int radix = 8;
const int base = (1<<radix);
int N, A, B, C;
queue <int> Q[2][base];
 
void Read()
{
    ifstream f("radixsort.in");
    f >> N >> A >> B >> C;
    f.close();
}
 
int RadixSort()
{
    const int b = base - 1;
    Q[0][B & b].push(B);
    int oldx = B, x;
    for (int i = 2; i <= N; ++ i)
    {
        x = (1LL * A * oldx + 1LL * B) % C;
        Q[0][x & b].push(x);
        oldx = x;
    }
    int nrpasi = 32 / radix + ((32 % radix != 0) ? 1 : 0);
    int p = 0;
    for (int pas = 1; pas < nrpasi; ++ pas, p = 1 - p)
    {
        for (int rest = 0; rest < base; ++ rest)
            while (!Q[p][rest].empty())
            {
                int x = Q[p][rest].front(); Q[p][rest].pop();
                Q[1 - p][(x >> (pas * radix)) & b].push(x);
            }
    }
    return p;
}
 
void Write(const int p)
{
    ofstream g ("radixsort.out");
    int nr = 0;
    for (int rest = 0; rest < base; ++ rest)
    {
        while (!Q[p][rest].empty())
        {
            ++ nr;
            if (nr % 10 == 1)
                g << Q[p][rest].front() << " ";
            Q[p][rest].pop();
        }
    }
    g << "\n";
    g.close();
}
 
int main()
{
    Read();
    int p = RadixSort();
    Write(p);
    return 0;
}