Pagini recente » Cod sursa (job #1722653) | Cod sursa (job #2009655) | Cod sursa (job #846632) | Cod sursa (job #2357231) | Cod sursa (job #2057292)
#include <bits/stdc++.h>
using namespace std;
#pragma GCC optimize "O3"
#define uint unsigned int
ifstream fi("radixsort.in");
ofstream fo("radixsort.out");
#define BUFMAX 11000000
int bufcnt = BUFMAX - 1; char buf[BUFMAX];
inline void write(uint x) {
buf[bufcnt--] = ' ';
do buf[bufcnt--] = x % 10 + '0', x /= 10; while (x);
}
inline void flush() { fo.write(buf + bufcnt + 1, BUFMAX - bufcnt - 2); }
#define MAX 10000000
#define MASK 0x1
uint v[MAX];
inline void radix(int lef, int rig, uint v[], int bit) {
int x[MASK + 1], y[MASK + 1];
memset(y, 0, sizeof y);
for (int i = lef; i < rig; i++) y[v[i] >> bit & MASK]++;
y[0] += lef; for (int i = 1; i <= MASK; i++) y[i] += y[i - 1];
for (int i = 1; i <= MASK; i++) x[i] = y[i - 1]; x[0] = lef;
//for (int i = 0; i <= MASK; i++) cout << x[i] << ' ' << y[i] << '\n';
for (int i = 0; i <= MASK; i++)
while (x[i] < y[i]) {
int j = v[x[i]] >> bit & MASK;
if (i != j) {
while ((v[x[j]] >> bit & MASK) == j) x[j]++;
v[x[i]] ^= v[x[j]] ^= v[x[i]] ^= v[x[j]];
} else x[i]++;
}
for (int i = 1; i <= MASK; i++) x[i] = y[i - 1]; x[0] = lef;
for (int i = 0; i <= MASK; i++) if (x[i] < y[i] && bit > 0) {
//cout << x[i] << ' ' << y[i] << ' ' << bit - 8 << ' ' << i << '\n';
radix(x[i], y[i], v, bit - 1);
}
}
int main() {
int n; unsigned long long a; uint b, c; fi >> n >> a >> b >> c;
v[0] = b; a %= c, b %= c;
for (int i = 1; i < n; i++) {
unsigned long long t = a * v[i - 1] + b;
uint thi = t >> 32, tlo = t; int aux;
asm("divl %4" : "=a"(aux), "=d"(v[i]) : "0"(tlo), "1"(thi), "r"(c));
}
radix(0, n, v, 31);
for (int i = n - 1 - (n - 1) % 10; i >= 0; i -= 10) write(v[i]); flush();
}