Pagini recente » Cod sursa (job #1957026) | Cod sursa (job #1234327) | Cod sursa (job #825861) | Cod sursa (job #1902406) | Cod sursa (job #2190871)
#include <cstdio>
#include <cstring>
#define MAXN 10000000
#define BUFF (1<<16)
int v[2][MAXN], nxt[MAXN], ut[1<<16], prim[1<<16];
int msk[2] = {(1<<16) - 1, (((1 << 16)- 1) << 16)};
int sft[2] = {1, (1 << 16)};
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, p, l, i, j, m, x;
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(m = 0; m < 2; m++){
l = !l;
memset(ut, -1, sizeof ut);
memset(prim, -1, sizeof prim);
memset(nxt, -1, sizeof nxt);
for(i = 0; i < n; i++){
x = (v[!l][i] & msk[m]) / sft[m];
if(prim[x] == -1){
prim[x] = ut[x] = i;
}
else{
nxt[ut[x]] = i;
ut[x] = i;
}
}
j = 0;
for(i = 0; i < (1 << 16); i++){
p = prim[i];
while(p != -1){
v[l][j] = v[!l][p];
p = nxt[p];
j++;
}
}
}
out = fopen("radixsort.out", "w");
for(i = 0; i < n; i += 10)
afis(v[l][i]);
flush();
fclose(out);
return 0;
}