Pagini recente » Cod sursa (job #2509489) | Cod sursa (job #668318) | Cod sursa (job #147650) | Cod sursa (job #2586096) | Cod sursa (job #2190895)
#include <cstdio>
#include <cstring>
#define MAXN 10000000
#define D 8
#define BUFF (1<<16)
#define MASK ((1 << D) - 1)
int v[2][MAXN], nr[MASK + 1];
char s[BUFF + 1];
int ds;
FILE *out;
inline void flush(){
s[ds] = 0;
fputs(s, out);
ds = 0;
}
inline void afisch(char ch){
s[ds++] = ch;
if(ds == BUFF)
flush();
}
inline void afis(int x){
int p10 = 1;
while(p10 <= x / 10)
p10 *= 10;
while(p10 > 0){
afisch(x / p10 % 10 + '0');
p10 /= 10;
}
afisch(' ');
}
int main(){
FILE *in = fopen("radixsort.in", "r");
int n, a, b, c, l, i, sft;
fscanf(in, "%d%d%d%d", &n, &a, &b, &c);
fclose(in);
v[0][0] = b;
for(i = 1; i < n; i++){
v[0][i] = (1LL * a * v[0][i - 1] + b) % c;
}
l = 0;
for(sft = 0; sft < 32; sft += D){
l = !l;
memset(nr, 0, sizeof nr);
for(i = 0; i < n; i++){
nr[(v[!l][i] >> sft) & MASK]++;
}
for(i = 1; i <= MASK; i++){
nr[i] += nr[i - 1];
}
for(i = n - 1; i >= 0; i--){
v[l][--nr[(v[!l][i] >> sft) & MASK]] = v[!l][i];
}
}
out = fopen("radixsort.out", "w");
for(i = 0; i < n; i += 10)
afis(v[l][i]);
flush();
fclose(out);
return 0;
}