Pagini recente » Cod sursa (job #683049) | Cod sursa (job #1602313) | Cod sursa (job #592257) | Cod sursa (job #890906) | Cod sursa (job #1493383)
#include <cstdio>
#include <cstring>
#define NMAX 10000005
#define cifmax 15
using namespace std;
int n,a,b,c,v[NMAX],next[cifmax],last[cifmax],prim[cifmax],temp[NMAX],x,i,j,div;
int main()
{
freopen("radixsort.in","r",stdin);
freopen("radixsort.out","w",stdout);
scanf("%d %d %d %d\n",&n,&a,&b,&c);
//scanf("%d",&n);
for (i=1; i<=n; i++)
{
if (i==1)v[i]=b;
else v[i]=(v[i-1]*a+b)%c;
//scanf("%d",&v[i]);
}
//memcpy(temp,v,sizeof(v));
for (div=1; div<=1000000000; div*=10)
{
memset(next,0,sizeof(next));
memset(last,0,sizeof(last));
memset(prim,0,sizeof(prim));
for (i=0; i<=9; i++)
{
for (j=1; j<=n; j++)
if ((v[j]/div)%10==i)
{
if (prim[i]==0)prim[i]=j , last[i]=j;
else next[last[i]]=j,last[i]=j;
}
}
j=0;
for (i=0; i<=9; i++)
if (prim[i]==last[i]&&prim[i]!=0)temp[++j]=v[prim[i]];
else if (prim[i]!=last[i])
{
temp[++j]=v[prim[i]];
x=prim[i];
while(next[x]!=0&&j<=n)
{
temp[++j]=v[next[x]];
x=next[x];
}
if (x>0&&x<=n&&temp[j]!=v[x])temp[++j]=v[x];
}
for (j=1;j<=n;j++)
v[j]=temp[j];
}
for (i=1; i<=n; i+=10)
printf("%d ",temp[i]);
printf("\n");
return 0;
}