hdu 5225

来源:互联网 发布:剑网三数据互通查询 编辑:程序博客网 时间:2024/06/08 11:29

很精妙的一种方法、

#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<cmath>#include<algorithm>#define maxn 110#define mod 1000000007using 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;}


0 0
原创粉丝点击