Pagini recente » Cod sursa (job #1913547) | Cod sursa (job #1459399) | Cod sursa (job #2528913) | Cod sursa (job #1515873) | Cod sursa (job #1842886)
#include <cstdio>
#define NMAX 10000003
#define grupa(nr, step) ((nr >> step) & 1)
using namespace std;
typedef long long int64;
int64* s[2][2];
int64 ls[2][2];
int64 n, a, b, c;
int64 pc = 0, lc = 0, *vc, indc = -1;
int64 mc = 1, mp;
inline void next(int64& val)
{
while(pc == lc)
{
vc = s[mp][++indc];
lc = ls[mp][indc];
pc = 0;
}
val = vc[pc++];
}
int main()
{
int64 i, gr = 0, aux, prev;
freopen("radixsort.in", "r", stdin);
freopen("radixsort.out", "w", stdout);
scanf("%lld%lld%lld%lld", &n, &a, &b, &c);
for(i = 0; i < 2; i++)
{
s[0][i] = new int64[n + 3];
s[1][i] = new int64[n + 3];
}
prev = b;
s[0][prev & 1][ls[0][prev & 1]++] = prev;
for(i = 1; i < n; i++)
{
aux = ((1LL * a * prev) % c + b) % c;
s[0][aux & 1][ls[0][aux & 1]++] = aux;
prev = aux;
}
for(gr = 1; gr != 33; gr++)
{
for(i = 0; i < 2; i++) ls[mc][i] = 0;
for(i = 0; i < n; i++)
{
next(aux);
s[mc][grupa(aux, gr)][ls[mc][grupa(aux, gr)]++] = aux;
}
pc = 0; lc = 0; indc = -1;
mc = mp;
mp = (mp == 1) ? 0 : 1;
}
mp = mc;
for(i = 0; i < n; i++)
{
next(aux);
if(i % 10 == 0) printf("%lld ", aux);
}
for(i = 0; i < 2; i++)
{
delete[] s[0][i];
delete[] s[1][i];
}
return 0;
}