Pagini recente » Cod sursa (job #1757981) | Cod sursa (job #2912286) | Cod sursa (job #1079044) | Cod sursa (job #178077) | Cod sursa (job #1474314)
#include <cstdio>
#include <cstring>
#include <vector>
#define NMAX 10000007
#define msk (1<<8) - 1
using namespace std;
FILE *fin, *fout;
int n, a, b, c, v[NMAX], vec[NMAX];
struct cntsort
{
vector<int> mem;
int sze;
} cntsort[msk+7];
int bucket(int nr, int x)
{
nr>>=((x-1)*8);
return nr&msk;
}
void citire()
{
scanf("%d %d %d %d", &n, &a, &b, &c);
v[1] = b;
vec[1] = 1;
for(int i = 2; i<= n; ++i)
{
vec[i] = i;
v[i] = (1LL*a*v[i-1] + b)%c;
}
}
void radix(int st, int dr, int lvl)
{
if(lvl == 0) return ;
int tmp;
memset(cntsort, 0, sizeof(cntsort));
for(int i = st; i<= dr; ++i)
{
tmp = bucket(v[vec[i]], lvl);
cntsort[tmp].sze++;
cntsort[tmp].mem.push_back(vec[i]);
}
tmp = st;
for(int i = 0; i<= msk; ++i)
{
for(int j = 0; j< cntsort[i].sze; ++j)
{
vec[tmp] = cntsort[i].mem[j];
tmp++;
}
}
if(tmp != dr + 1) printf("check\n");
///selectie
int start = st, fin;
for(int i = st; i<= dr; ++i)
{
if(i == dr)
{
fin = i;
radix(start, fin, lvl-1);
break;
}
if(bucket(v[vec[i+1]], lvl) != bucket(v[vec[i]], lvl))
{
fin = i;
radix(start, fin, lvl-1);
start = i+1;
}
}
}
void afisare()
{
for(int i = 1; i<= n; i+=10)
{
printf("%d ", v[vec[i]]);
}
printf("\n");
}
int main()
{
fin = freopen("radixsort.in", "r", stdin);
fout = freopen("radixsort.out", "w", stdout);
citire();
radix(1, n, 4);
afisare();
fclose(fin);
fclose(fout);
return 0;
}