cf 938E

哇自闭了。

一样个毛啊。

和之前见过的几道感觉很类似啊。

首先一个数如果有贡献那么在他后面一定有一个大于它的数,并且前面的全比他小,然后我就跑偏了。。。

于是我们先排个序,显然无影响,我们可以考虑从 n 个位置里选择 n-i+1 个,用来存放 大于等于他自己的数,

这n-i+1个位置要保证 他自己在最前面吧,就是 (n-i)! 种,剩下i-1个位置随便放,(i-1)! 

所以一个数的贡献次数 就是 C(n,n-i+1)*(i-1)!*(n-i)!,然后再乘上权值和次数就阔以惹qwq

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 const int N = 1e6+6;
 5 const ll mod = 1e9+7;
 6 int n;ll a[N];
 7 ll up[N],inv[N],down[N];
 8 void init(){
 9     inv[1]=down[0]=up[0]=1;
10     for(int i=2;i<=1e6;i++){
11         inv[i]=(mod-mod/i)*inv[mod%i]%mod;
12     }
13     for(int i=1;i<=1e6;i++){
14         up[i]=up[i-1]*i%mod;
15         down[i]=down[i-1]*inv[i]%mod;
16     }
17 }
18 int main(){
19     //ios::sync_with_stdio(false);
20     init();
21     scanf("%d",&n);
22     for(int i=1;i<=n;i++)scanf("%d",&a[i]);
23     sort(a+1,a+1+n);
24     ll ans=0;
25     for(int i=1,j;i<=n;i=j+1){
26         j=i;
27         while (a[j+1]==a[i])j++;
28         if(j<n)
29         ans=(ans+a[i]*(j-i+1)%mod*up[n]%mod*up[n-i]%mod*up[i-1]%mod*down[n-i+1]%mod*down[i-1]%mod)%mod;
30     }
31     cout<<ans<<endl;
32 }
View Code

 

posted @ 2019-02-02 16:20  MXang  阅读(851)  评论(0编辑  收藏  举报