Pagini recente » Cod sursa (job #3194808) | Cod sursa (job #1247598) | Cod sursa (job #697779) | Cod sursa (job #642283) | Cod sursa (job #1494448)
#include <fstream>
#include <cstdio>
using namespace std;
int prim[11],ultim[11],n,i,k,in,inn;
long long a,b,c,v[10000010],temporar[10000010],nxt[10000010],pr,ma;
int main()
{
freopen("radixsort.in","r",stdin);
ofstream g ("radixsort.out");
scanf("%d%lld%lld%lld",&n,&a,&b,&c);
v[1]=b;ma=b;
for(i=2; i<=n; ++i){
v[i] = (a * v[i-1] + b) % c;
if(v[i]>ma)ma=v[i];}
pr=1;
while(pr<ma)
{
k=0;
for(i=1; i<=n; ++i)
{
c=v[i]/pr%10;
if(prim[c]==0)prim[c]=i;
if(ultim[c]==0)ultim[c]=i;
else nxt[ultim[c]]=i,ultim[c]=i;
}
for(i=0; i<=9; ++i)
if(prim[i]==ultim[i]&&prim[i]!=0)temporar[++k]=v[prim[i]];
else if(prim[i]!=0)
{
in=prim[i];
temporar[++k]=v[in];
while(nxt[in]!=0)
{
temporar[++k]=v[nxt[in]];
inn=nxt[in];
nxt[in]=0;
in=inn;
}
}
for(i=0; i<=9; ++i)
prim[i]=0,ultim[i]=0;
for(i=1; i<=n; ++i)
v[i]=temporar[i];
pr*=10;
}
for(i=1; i<=n; i+=10)
g<<v[i]<<" ";
return 0;
}