Cod sursa(job #1557849)

Utilizator dobrebogdanDobre Bogdan Mihai dobrebogdan Data 28 decembrie 2015 13:18:22
Problema Radix Sort Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.67 kb
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
const int nmax=10000000;
unsigned ve[nmax+5],v2[nmax+5],p2[35];
char si[nmax+5];
int main()
{
    freopen("radixsort.in","r",stdin);
     freopen("radixsort.out","w",stdout);
    long long int a,b,c,d;
    int i,n,st,dr,l,j,af,x,p0,p1;
    af=0;
    dr=n;
    cin>>n>>a>>b>>c;
    ve[1]=b;
    d=0;
    for(i=2; i<=n; i++)
    {
        d=(d*a+b);
        if(d>=c)
            d=d%c;
        ve[i]=d;
    }
    p2[0]=1;
    for(i=1; i<=29; i++)
        p2[i]=p2[i-1]*2;
    l=1;
    for(i=0; i<=29; i++)
    {
        st=dr=l;
        p1=l;
        for(j=l; j<=n; j++)
            if(ve[j]<p2[i])
            {
                v2[st]=ve[j];
                st++;
                p1++;
            }
            else if(!(ve[j] & p2[i]))
            {
                p1++;
            }
        dr=st;
        for(j=l; j<=n; j++)
            if(ve[j]>=p2[i])
            {
                if(!(ve[j] & p2[i]))
                {
                    v2[dr]=ve[j];
                    dr++;
                }
                else if(ve[j] & p2[i])
                {
                    v2[p1]=ve[j];
                    p1++;
                }
            }

        memcpy(ve+l,v2+l,sizeof(ve)-l*(sizeof(int)));
        l=st;
    }
    printf("%d\n",l);
x=n/10*10+1;
if(x>n)
    x=x-10;
for(i=x; i>=1; i=i-10)
{
    j=ve[i];
    do
    {
        af++;
        si[af]=j%10+'0';
        j=j/10;
    }
    while(j!=0);
    af++;
    si[af]=' ';
}
af--;
for(i=af/2; i>=1; i--)
    swap(si[i],si[af-i+1]);
printf("%s\n",si+1);
return 0;
}