You are given an array a of length n. We define fa the following way:
- Initially fa = 0, M = 1;
- for every 2 ≤ i ≤ n if aM < ai then we set fa = fa + aM and then set M = i.
Calculate the sum of fa over all n! permutations of the array a modulo 109 + 7.
Note: two elements are considered different if their indices differ, so for every array a there are exactly n! permutations.
The first line contains integer n (1 ≤ n ≤ 1 000 000) — the size of array a.
Second line contains n integers a1, a2, ..., an (1 ≤ ai ≤ 109).
Print the only integer, the sum of fa over all n! permutations of the array a modulo 109 + 7.
2 1 3
1
3 1 1 2
4
For the second example all the permutations are:
- p = [1, 2, 3] : fa is equal to 1;
- p = [1, 3, 2] : fa is equal to 1;
- p = [2, 1, 3] : fa is equal to 1;
- p = [2, 3, 1] : fa is equal to 1;
- p = [3, 1, 2] : fa is equal to 0;
- p = [3, 2, 1] : fa is equal to 0.
Where p is the array of the indices of initial array a. The sum of fa is equal to 4.
题意:给你n个数字,求所有排列的fa的和:
对于一个排列来说,一开始fa为1,m=1,若a[m]<a[i] fa=fa+a[m]。
题解:这种题我们肯定不能考虑,所以我们换个思路,计算每个数字的贡献。如果有一个数字能够产生贡献,那么比他大的数字都在他的后面,所以情况数为:
相当于在后面任意挑选大于等于这个数的数量的位置,然后比他大的数字可以随意排列,剩下的数字也能随意排列的方案数。
我们把这个式子化简,得到
结论题,直接算就行了。
代码:
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
typedef long long ll;
ll a[1000005],fac1[1000005],fac2[1000005],ans=0,n;
int main()
{
scanf("%I64d",&n);
for(int i=0;i<n;++i) scanf("%I64d",&a[i]);
sort(a,a+n);
fac1[0]=1; fac2[n+1]=1; fac2[n]=n;
for(int i=1;i<=n;i++) fac1[i]=fac1[i-1]*i%1000000007;
for(int i=n-1;i>=1;i--) fac2[i]=fac2[i+1]*i%1000000007;
for(int i=0,j=1;i<n&&a[i]!=a[n-1];i=j)
{
for(j=i;a[i]==a[j];j++);
ll num=j-i;
ans=(ans+num*((a[i]*fac1[n-i-1]%1000000007)*fac2[n-i+1]))%1000000007;
}
cout<<ans<<endl;
}