Cod sursa(job #542438)

Utilizator DraStiKDragos Oprica DraStiK Data 26 februarie 2011 13:25:30
Problema Sortari2 Scor 20
Compilator cpp Status done
Runda Romanian Master in Mathematics and Sciences 2011, Ziua 2 Marime 1.22 kb
#include <algorithm>
using namespace std;

#define MOD 999017
#define DIM 1005

int p[DIM],v[DIM];
int N,nrt;

void read ()
{
    scanf ("%d",&N);
}

void solve ()
{
    int i,j,sorted,steps,invers;

    for (i=1; i<=N; ++i)
        p[i]=i;

    do
    {
        steps=0;
        for (i=1; i<=N; ++i)
            v[i]=p[i];
        do
        {
            sorted=1;
            for (i=1; i<N; ++i)
                if (v[i]>v[i+1])
                {
                    swap (v[i],v[i+1]);
                    sorted=0;
                    ++steps;
                }
        }
        while (!sorted);

        invers=0;
        for (i=1; i<=N; ++i)
            v[i]=p[i];
        for (i=1; i<=N; ++i)
            if (v[i]!=i)
                for (j=i+1; j<=N; ++j)
                    if (v[j]==i)
                    {
                        ++invers;
                        swap (v[i],v[j]);
                    }
        if (steps>invers)
            nrt=(nrt+1)%MOD;
    }
    while (next_permutation (p+1,p+N+1));
}

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

    read ();
    solve ();
    printf ("%d",nrt);

    return 0;
}