Pagini recente » Cod sursa (job #215744) | Monitorul de evaluare | Cod sursa (job #3285579) | Cod sursa (job #3281492) | Cod sursa (job #2391589)
#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;
}