Cod sursa(job #1312983)

Utilizator vlady1997Vlad Bucur vlady1997 Data 10 ianuarie 2015 11:07:32
Problema Radix Sort Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 9.35 kb
        #include <cstdio>
        using namespace std;
        struct nod
        {
            long long int inf;
            nod *leg;
        };
        nod *prim_a, *prim_0, *prim_1, *prim_2, *prim_3, *prim_4, *prim_5, *prim_6, *prim_7, *prim_8, *prim_9;
        nod *u_0, *u_1, *u_2, *u_3, *u_4, *u_5, *u_6, *u_7, *u_8, *u_9;
        long long int sol[10000001], maxcif;
        int nrcif (int x)
        {
            int m=x, nr=0;
            while (m>0)
            {
                m/=10;
                nr++;
            }
            return nr;
        }
        int cif_i (int x, int i)
        {
            int m=x, nr=1;
            while (m>0)
            {
                if (nr==i)
                {
                    return m%10;
                }
                m/=10;
                nr++;
            }
        }
        nod *load (int n, int x, int y, int z)
        {
            long long int i, nr;
            nod *p, *q, *u;
            p=new nod; u=new nod;
            p->inf=y; p->leg=NULL;
            sol[1]=p->inf; u=p;
            maxcif=nrcif(sol[1]);
            for (i=2; i<=n; i++)
            {
                q=new nod;
                q->inf=(x*(u->inf)+y)%z;
                sol[i]=q->inf;
                nr=nrcif(sol[i]);
                if (nr>maxcif)
                {
                    maxcif=nr;
                }
                u->leg=q; q->leg=NULL;
                u=q;
            }
            return p;
        }
        int main()
        {
            long long int n, x, y, z, i, j, m, nr;
            bool sel0, sel1, sel2, sel3, sel4, sel5, sel6, sel7, sel8, sel9;
            nod *p, *q;
            freopen("radixsort.in","r",stdin);
            freopen("radixsort.out","w",stdout);
            scanf("%lld%lld%lld%lld",&n,&x,&y,&z);
            prim_a=new nod;
            prim_a=load(n,x,y,z); q=prim_a;
            for (i=1; i<=maxcif; i++)
            {
                sel0=false; sel1=false; sel2=false; sel3=false; sel4=false; sel5=false; sel6=false; sel7=false; sel8=false; sel9=false;
                for (j=1; j<=n; j++)
                {
                    q=new nod;
                    m=cif_i(sol[j],i);
                    if (m%10==0)
                    {
                        q->inf=sol[j];
                        q->leg=NULL;
                        if (!sel0) {prim_0=q; sel0=true;}
                        if (u_0!=NULL) u_0->leg=q;
                        u_0=q;
                    }
                    else if (m%10==1)
                    {
                        q->inf=sol[j];
                        q->leg=NULL;
                        if (!sel1) {prim_1=q; sel1=true;}
                        if (u_1!=NULL) u_1->leg=q;
                        u_1=q;
                    }
                    else if (m%10==2)
                    {
                        q->inf=sol[j];
                        q->leg=NULL;
                        if (!sel2) {prim_2=q; sel2=true;}
                        if (u_2!=NULL) u_2->leg=q;
                        u_2=q;
                    }
                    else if (m%10==3)
                    {
                        q->inf=sol[j];
                        q->leg=NULL;
                        if (!sel3) {prim_3=q; sel3=true;}
                        if (u_3!=NULL) u_3->leg=q;
                        u_3=q;
                    }
                    else if (m%10==4)
                    {
                        q->inf=sol[j];
                        q->leg=NULL;
                        if (!sel4) {prim_4=q; sel4=true;}
                        if (u_4!=NULL) u_4->leg=q;
                        u_4=q;
                    }
                    else if (m%10==5)
                    {
                        q->inf=sol[j];
                        q->leg=NULL;
                        if (!sel5) {prim_5=q; sel5=true;}
                        if (u_5!=NULL) u_5->leg=q;
                        u_5=q;
                    }
                    else if (m%10==6)
                    {
                        q->inf=sol[j];
                        q->leg=NULL;
                        if (!sel6) {prim_6=q; sel6=true;}
                        if (u_6!=NULL) u_6->leg=q;
                        u_6=q;
                    }
                    else if (m%10==7)
                    {
                        q->inf=sol[j];
                        q->leg=NULL;
                        if (!sel7) {prim_7=q; sel7=true;}
                        if (u_7!=NULL) u_7->leg=q;
                        u_7=q;
                    }
                    else if (m%10==8)
                    {
                        q->inf=sol[j];
                        q->leg=NULL;
                        if (!sel8) {prim_8=q; sel8=true;}
                        if (u_8!=NULL) u_8->leg=q;
                        u_8=q;
                    }
                    else if (m%10==9)
                    {
                        q->inf=sol[j];
                        q->leg=NULL;
                        if (!sel9) {prim_9=q; sel9=true;}
                        if (u_9!=NULL) u_9->leg=q;
                        u_9=q;
                    }
                }

                q=new nod; nr=0;
                q=prim_0;
                while (q->leg!=NULL)
                {
                    sol[++nr]=q->inf;
                    q=q->leg;
                } sol[++nr]=u_0->inf;
                q=prim_1;
                while (q->leg!=NULL)
                {
                    sol[++nr]=q->inf;
                    q=q->leg;
                } sol[++nr]=u_1->inf;
                q=prim_2;
                while (q->leg!=NULL)
                {
                    sol[++nr]=q->inf;
                    q=q->leg;
                } sol[++nr]=u_2->inf;
                q=prim_3;
                while (q->leg!=NULL)
                {
                    sol[++nr]=q->inf;
                    q=q->leg;
                } sol[++nr]=u_3->inf;
                q=prim_4;
                while (q->leg!=NULL)
                {
                    sol[++nr]=q->inf;
                    q=q->leg;
                } sol[++nr]=u_4->inf;
                q=prim_5;
                while (q->leg!=NULL)
                {
                    sol[++nr]=q->inf;
                    q=q->leg;
                } sol[++nr]=u_5->inf;
                q=prim_6;
                while (q->leg!=NULL)
                {
                    sol[++nr]=q->inf;
                    q=q->leg;
                } sol[++nr]=u_6->inf;
                q=prim_7;
                while (q->leg!=NULL)
                {
                    sol[++nr]=q->inf;
                    q=q->leg;
                } sol[++nr]=u_7->inf;
                q=prim_8;
                while (q->leg!=NULL)
                {
                    sol[++nr]=q->inf;
                    q=q->leg;
                } sol[++nr]=u_8->inf;
                q=prim_9;
                while (q->leg!=NULL)
                {
                    sol[++nr]=q->inf;
                    q=q->leg;
                } sol[++nr]=u_9->inf;

                p=new nod;
                q=prim_0;
                while (q->leg!=NULL)
                {
                    p=q;
                    q=q->leg;
                    delete p;
                } delete u_0;
                q=prim_1;
                while (q->leg!=NULL)
                {
                    p=q;
                    q=q->leg;
                    delete p;
                } delete u_1;
                q=prim_2;
                while (q->leg!=NULL)
                {
                    p=q;
                    q=q->leg;
                    delete p;
                } delete u_2;
                q=prim_3;
                while (q->leg!=NULL)
                {
                    p=q;
                    q=q->leg;
                    delete p;
                } delete u_3;
                q=prim_4;
                while (q->leg!=NULL)
                {
                    p=q;
                    q=q->leg;
                    delete p;
                } delete u_4;
                q=prim_5;
                while (q->leg!=NULL)
                {
                    p=q;
                    q=q->leg;
                    delete p;
                } delete u_5;
                q=prim_6;
                while (q->leg!=NULL)
                {
                    p=q;
                    q=q->leg;
                    delete p;
                } delete u_6;
                q=prim_7;
                while (q->leg!=NULL)
                {
                    p=q;
                    q=q->leg;
                    delete p;
                } delete u_7;
                q=prim_8;
                while (q->leg!=NULL)
                {
                    p=q;
                    q=q->leg;
                    delete p;
                } delete u_8;
                q=prim_9;
                while (q->leg!=NULL)
                {
                    p=q;
                    q=q->leg;
                    delete p;
                } delete u_9;
            }
            for (i=1; i<=n; i+=10)
            {
                printf("%d ",sol[i]);
            }
            fclose(stdin);
            fclose(stdout);
            return 0;
        }