Cod sursa(job #542468)

Utilizator PavelRazvanPavel Razvan PavelRazvan Data 26 februarie 2011 14:01:49
Problema Sortari2 Scor 20
Compilator cpp Status done
Runda Romanian Master in Mathematics and Sciences 2011, Ziua 2 Marime 1.43 kb
#include<algorithm>
using namespace std;

#define DIM 1005

int n,a[DIM],sol,b[DIM],c[DIM];
bool v[DIM];

inline int mod (int x)
{
    while(x>=999017)
        x-=999017;
    return x;
}

void back (int k)
{
    int i,j;
    if(k==n+1)
    {
        int sol1=0,sol2=0,aux;


        for(i=1;i<=n;++i)
        {
            b[i]=a[i];
            c[i]=a[i];
        }

        for(i=1;i<=n;++i)
            for(j=i+1;j<=n;++j)
                if(b[i]>b[j])
                {
                    ++sol1;
                    aux=b[j];
                    b[j]=b[i];
                    b[i]=aux;
                }
        for(i=1;i<=n;++i)
        {
            if(c[i]!=i)
            {
                ++sol2;
                for(j=i+1;j<=n;++j)
                    if(c[j]==i)
                    {
                        aux=c[j];
                        c[j]=c[i];
                        c[i]=aux;break;
                    }
            }
        }

        if(sol2<sol1)
            sol=mod(sol+1);
    }
    else
    {
        for(i=1;i<=n;++i)
            if(v[i]==0)
            {
                a[k]=i;
                v[i]=1;
                back(k+1);
                v[i]=0;
            }
    }

}
int main ()
{
    freopen("sortari2.in","r",stdin);
    freopen("sortari2.out","w",stdout);

    scanf("%d",&n);
    back(1);
    printf("%d\n",mod(sol));
    return 0;
}