CF938E Max History [组合数学]

Posted qq62c30ac77b2a7

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CF938E Max History [组合数学]相关的知识,希望对你有一定的参考价值。

​传送门​

考虑一个数怎样才能有贡献

即没有>它的在它的前面,即它前面的全部<=它

我们记小于一个数的个数为 m,

首先比它大的 n-m-1 个数, 在它后面,可以随意全排列一下, 就是CF938E

然后把这剩下的 m 个数插进去,有 n 个空位,所以是 CF938E, 在乘上本身的全排列

于是算出这个数的贡献就是  CF938E

#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 [组合数学]的主要内容,如果未能解决你的问题,请参考以下文章

[题解] [CF938E] Max History

Codeforces 938E Max History:排列 + 逆元考虑单个元素的贡献

cf 938E

CF1355C Count Triangles

CF1486D Max Median

CF1083C Max Mex 线段树