1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
| #include<bits/stdc++.h>
using namespace std;
inline int Get_Int() { int num=0,bj=1; char x=getchar(); while(!isdigit(x)) {if(x=='-')bj=-1;x=getchar();} while(isdigit(x)) {num=num*10+x-'0';x=getchar();} return num*bj; }
const int maxn=2005,mod=1e9+7;
void check(int &x) {x=x>=mod?x-mod:(x<0?x+mod:x);} void Add(int &x,int v) {x+=v;check(x);}
int n,a[maxn],b[maxn],fac[maxn],f[maxn][maxn],g[maxn];
struct BIT { int c[maxn]; #define lowbit(x) x&(-x) void add(int x,int v) {for(int i=x; i<=n; i+=lowbit(i))Add(c[i],v);} int query(int x) {int ans=0;for(int i=x; i; i-=lowbit(i))Add(ans,c[i]);return ans;} void clear() {fill(c+1,c+n+1,0);} } bit;
int main() { n=Get_Int(); fac[0]=1; for(int i=1; i<=n; i++) { b[i]=a[i]=Get_Int(); fac[i]=1ll*fac[i-1]*i%mod; } sort(b+1,b+n+1); int tot=unique(b+1,b+n+1)-b-1; for(int i=1; i<=n; i++)a[i]=lower_bound(b+1,b+tot+1,a[i])-b; f[0][0]=1; for(int i=1; i<=n; i++)f[i][1]=1; for(int j=2; j<=n; j++) { bit.clear(); for (int i=1; i<=n; i++) { if(a[i-1])bit.add(a[i-1],f[i-1][j-1]); Add(f[i][j],bit.query(a[i])); } } for(int i=0; i<=n; i++) for(int j=0; j<=n; j++)Add(g[j],f[i][j]); for(int i=1; i<=n; i++)g[i]=1ll*g[i]*fac[n-i]%mod; int ans=0; for(int i=1; i<=n; i++)Add(ans,g[i]-1ll*g[i+1]*(i+1)%mod); printf("%d\n",ans); return 0; }
|