哇自閉了。
一樣個毛啊。
和之前見過的幾道感覺很類似啊。
首先一個數如果有貢獻那么在他后面一定有一個大於它的數,並且前面的全比他小,然后我就跑偏了。。。
於是我們先排個序,顯然無影響,我們可以考慮從 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 }
