hdu 5225

很精妙的一种方法、

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#define maxn 110
#define mod 1000000007
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
int n,a[maxn],F[maxn],fact[maxn];
void Prepare(int n)
{
    fact[0]=1;
    for(int i=1; i<=n; i++)
        fact[i]=(LL)fact[i-1]*i%mod,F[i]=(LL)i*(i-1)/2*fact[i]%mod*(1+mod)/2%mod;
}

void read()
{
    for(int i=1; i<=n; i++) scanf("%d",a+i);
}

int work()
{
    static bool use[maxn];
    static int sum[maxn];
    int ans=0;
    memset(sum,0,sizeof(sum));
    memset(use,false,sizeof(use));
    int cnt=0;
    for(int i=1; i<=n; i++)
    {
        for(int j=1; j<a[i]; ++j)
            if(!use[j])
            {
                LL val=0;
                for(int k=1; k<i; ++k)
                    val+=a[k]>j;
                val+=cnt;
                for(int k=1; k<=n; ++k)
                    if(k!=j&&!use[k])
                    {
                        val+=sum[k];
                        val+=k<j;
                    }
                val%=mod;
                ans=(ans+val*fact[n-i]+F[n-i])%mod;
            }
        for(int j=1; j<i; ++j)
            cnt+=a[j]>a[i];
        for(int j=a[i]; j>=1; --j)
            ++sum[j];
        use[a[i]]=true;
    }
    return ans;
}
int main()
{
    Prepare(100);
    while(cin>>n)
    {
        read();
        cout<<work()<<endl;
    }
    return 0;
}


你可能感兴趣的:(hdu 5225)