CF938E Max History [组合数学]
Posted qq62c30ac77b2a7
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CF938E Max History [组合数学]相关的知识,希望对你有一定的参考价值。
传送门
考虑一个数怎样才能有贡献
即没有>它的在它的前面,即它前面的全部<=它
我们记小于一个数的个数为 m,
首先比它大的 n-m-1 个数, 在它后面,可以随意全排列一下, 就是
然后把这剩下的 m 个数插进去,有 n 个空位,所以是 , 在乘上本身的全排列
于是算出这个数的贡献就是
#include<bits/stdc++.h>
#define N 1000050
using namespace std;
typedef long long ll;
const int Mod = 1000000007;
int n, a[N];
ll fac[N], ans;
ll add(ll a, ll b) return (a+b) % Mod;
ll mul(ll a, ll b) return (a*b) % Mod;
ll power(ll a, ll b) ll ans = 1; for(;b;b>>=1)if(b&1) ans = mul(ans, a); a = mul(a, a); return ans;
int main()
scanf("%d", &n); fac[0] = 1;
for(int i=1; i<=n; i++) fac[i] = mul(fac[i-1], i);
for(int i=1; i<=n; i++) scanf("%d", &a[i]);
sort(a+1, a+n+1);
for(int i=1, j=1; i<=n; i=j+1)
while(a[i] == a[j+1]) j++;
if(j == n) break;
ans = add(ans, mul((ll)a[i], mul(j - i + 1, mul(fac[n], power(n - i + 1, Mod - 2)))));
printf("%lld", ans); return 0;
以上是关于CF938E Max History [组合数学]的主要内容,如果未能解决你的问题,请参考以下文章