Pagini recente » Cod sursa (job #1080942) | Cod sursa (job #371591) | Cod sursa (job #991924) | Cod sursa (job #2212776) | Cod sursa (job #2138791)
#include <cstdio>
unsigned int N, A, B, C, v[10000000], w[10000000], p;
__attribute__((always_inline)) void CountingSort(unsigned int A[], unsigned int B[], unsigned int digit)
{
unsigned int frequence[256]{}, index[256]; index[0] = ~0;
for(unsigned int i = N; i; ++frequence[A[--i] >> digit & 255]);
for(unsigned int i = 0; i != 256; index[++i] = index[~-i] + frequence[~-i]);
for(unsigned int i = 0; i != N; ++i) B[++index[A[i] >> digit & 255]] = A[i];
}
__attribute__((always_inline)) void read(unsigned int &num)
{
static char inBuffer[64];
static unsigned int p = 0; num = 0;
fread(inBuffer, 1, 64, stdin);
while(inBuffer[p] < 48 | inBuffer[p] > 57)
{
++p;
}
while(inBuffer[p] > 47 & inBuffer[p] < 58)
{
num = num * 10 + inBuffer[p] - 48;
++p;
}
}
char outBuffer[11000000];
__attribute__((always_inline)) void itoa(unsigned int x)
{
unsigned int digits = x > 999999999 ? 10 :
x > 99999999 ? 9 :
x > 9999999 ? 8 :
x > 999999 ? 7 :
x > 99999 ? 6 :
x > 9999 ? 5 :
x > 999 ? 4 :
x > 99 ? 3 :
x > 9 ? 2 : 1;
for(unsigned int i = ~-digits; ~i; --i)
{
outBuffer[p + i] = x % 10 + 48;
x = x / 10;
}
p = p + digits; outBuffer[p++] = 32;
}
int main()
{
freopen("radixsort.in", "r", stdin);
freopen("radixsort.out", "w", stdout);
read(N); read(A); read(B); read(C);
v[0] = B;
for(unsigned int i = 1; i != N; ++i)
{
unsigned long long j = 1ULL * v[~-i] * A + B;
v[i] = C > j ? j : j - j / C * C;
}
CountingSort(v, w, 0);
CountingSort(w, v, 8);
CountingSort(v, w, 16);
CountingSort(w, v, 24);
for(unsigned int i = 0; i != N; i = i + 10)
{
itoa(v[i]);
}
fwrite(outBuffer, 1, p, stdout);
return 0;
}