Pagini recente » Cod sursa (job #312236) | Cod sursa (job #1563627) | Cod sursa (job #702306) | Cod sursa (job #2257520) | Cod sursa (job #1375875)
#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();
}