Pagini recente » Cod sursa (job #356116) | Cod sursa (job #1642827) | Cod sursa (job #662696) | Cod sursa (job #2923722) | Cod sursa (job #1493382)
# include <cstdio>
# define MAX 10000010
using namespace std;
int prim[15], ultm[15];
int a[MAX], next[MAX], aux[MAX];
int n, M, c, i, j;
long long div, A, B, C;
// next -> prim[c] -> ultm[c]
void finish(){
int j;
for (j = 1; j <= n; j++)
a[j] = aux[j];
for (j = 0; j <= 9; j++)
aux[j] = prim[j] = ultm[j] = next[j] = 0;
}
int main ()
{
freopen("radixsort.in","r",stdin);
freopen("radixsort.out","w",stdout);
scanf("%d %lld %lld %lld", &n, &A, &B, &C);
a[1] = B;
for (i = 2; i <= n; i++)
a[i] = (A * a[i-1] + B) % C;
div = 1;
for (i = 0; i <= 9; i++)
{
for (j = 1; j <= n; j++)
{
if (prim[(a[j] / div) % 10] == 0) prim [(a[j] / div) % 10] = j, ultm [(a[j] / div) % 10] = j;
else
{
next[ultm[(a[j] / div) % 10]] = j;
ultm[(a[j] / div) % 10] = j;
}
}
M = 0;
for (c = 0; c <= 9; c++)
{
if (prim[c] != 0)
{
for (j = prim[c]; j < ultm[c]; j = next[j])
aux[++M] = a[j];
aux[++M] = a[ultm[c]];
}
}
finish();
div *= 10;
}
for (i = 1; i <= n; i+=10)
printf("%d ",a[i]);
return 0;
}