题目链接:http://codeforces.com/problemset/problem/938/E

题意:

  定义f(a):

    初始时f(a) = 0, M = 1。

    枚举i = 2 to n,如果a[i] > a[M],那么f(a) += a[M], M = i。

  给定长度为n的数组a,问你它的所有排列的f(a)之和 MOD 1e9+7。

题解:

  对于某个确定排列中的一个数a[i],如果所有大于等于a[i]的数都排在a[i]之后,那么一定ans += a[i]。

  所以就要求每个a[i]对于答案的贡献,相加起来即为总答案。

  先将a[i]升序排列。

  考虑由所有n个数组成的排列:

    总排列数为n!。

  仅考虑由大于等于a[i]的数组成的排列:

    大于等于a[i]的数共有n-i+1个。

    总排列数为(n-i+1)!。

    其中a[i]排在最前面的排列有(n-i)!个。

  所以由n个数组成,且所有大于等于a[i]的数都排在a[i]之后

  这样的排列的总数为(n-i)! / (n-i+1)! * n!个。

  化简即为n!/(n-i+1)个。

  所以a[i]对答案作出的贡献为:n! / (n-i+1) * a[i]。

  所以对于区间[i,nex),如果a[i to nex-1]都相等的话

  这个区间对答案做出的总贡献即为:n! / (n-i+1) * a[i] * (nex-i)

  特别地,如果有a[i] == a[n],显然它对答案的贡献为0。

  另外,对于贡献中的除以(n-i+1),应该写成乘inv(n-i+1)。

  最后O(n)统计一下就好。

AC Code:

 #include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#define MAX_N 1000005
#define MOD 1000000007 using namespace std; int n;
int a[MAX_N];
long long ans=; void exgcd(int a,int b,int &x,int &y)
{
if(b==)
{
x=; y=;
return;
}
exgcd(b,a%b,y,x);
y-=(a/b)*x;
} int inv(int a)
{
int x,y;
exgcd(a,MOD,x,y);
return (x%MOD+MOD)%MOD;
} int main()
{
cin>>n;
for(int i=;i<=n;i++) cin>>a[i];
long long f=;
for(int i=;i<=n;i++) f=f*i%MOD;
sort(a+,a++n);
int nex=;
for(int i=;i<=n;i=nex)
{
if(a[i]==a[n]) break;
while(nex<=n && a[i]==a[nex]) nex++;
ans=(ans+f*inv(n-i+)%MOD*a[i]%MOD*(nex-i)%MOD)%MOD;
}
cout<<ans<<endl;
}

Codeforces 938E Max History:排列 + 逆元【考虑单个元素的贡献】的更多相关文章

  1. CodeForces 938E Max History 题解

    参考自:https://blog.csdn.net/dreaming__ldx/article/details/84976834 https://blog.csdn.net/acterminate/a ...

  2. 2018.12.12 codeforces 938E. Max History(组合数学)

    传送门 唉最开始居然把题给看错了. 其实是组合数学傻逼题呢. 题意简述:给出一个数列,定义一个与数列有关的fff函数,fff函数定义如下: 首先f=0,M=1f=0,M=1f=0,M=1,一直重复如下 ...

  3. Selenium定位一 --单个元素定位方法

    Selenium-Webdriver 提供了强大的元素定位方法,支持以下三种方法. 单个对象的定位方法 多个对象的定位方法 层级定位 定位单个元素在定位单个元素时,selenium-webdriver ...

  4. 定义一个Collection接口类型的变量,引用一个Set集合的实现类,实现添加单个元素, 添加另一个集合,删除元素,判断集合中是否包含一个元素, 判断是否为空,清除集合, 返回集合里元素的个数等常用操作。

    package com.lanxi.demo2; import java.util.HashSet; import java.util.Iterator; import java.util.Set; ...

  5. Linq扩展方法获取单个元素

    在使用Linq 提供的扩展方法时,First(OrDefault), Single(OrDefault), Last(OrDefault)都具有返回单个元素的功能.MSDN对这些方法的描述只有功能说明 ...

  6. python 列表删除元素,单个元素,多个连续或不连续元素

    以列表a为例 import numpy as np a = ['上海市', '云南省', '内蒙古', '四川省', '天津市', '宁夏', '安徽省', '山东省', '山西省'] 删除单个元素 ...

  7. Max History CodeForces - 938E (组合计数)

    You are given an array a of length n. We define fa the following way: Initially fa = 0, M = 1; for e ...

  8. BZOJ.4517.[SDOI2016]排列计数(错位排列 逆元)

    题目链接 错位排列\(D_n=(n-1)*(D_{n-1}+D_{n-2})\),表示\(n\)个数都不在其下标位置上的排列数. 那么题目要求的就是\(C_n^m*D_{n-m}\). 阶乘分母部分的 ...

  9. CodeForces 57C Array 组合计数+逆元

    题目链接: http://codeforces.com/problemset/problem/57/C 题意: 给你一个数n,表示有n个数的序列,每个数范围为[1,n],叫你求所有非降和非升序列的个数 ...

随机推荐

  1. if you have content fetched asynchronously on pages where SEO is important, SSR might be necessary

    if you have content fetched asynchronously on pages where SEO is important, SSR might be necessary

  2. 阿里云 如何减少备份使用量? mysql数据库的完整备份、差异备份、增量备份

    RDS for MySQL备份.SQL审计容量相关问题_MYSQL使用_技术运维问题_云数据库 RDS 版-阿里云 https://help.aliyun.com/knowledge_detail/4 ...

  3. 如何搭建一个 Git 版本控制服务端?

    Gogs 下载和安装 https://github.com/gogits/gogs # 下载二进制压缩包 不检查服务器证书 root@cheungxiongwei:~# wget --no-check ...

  4. JS判断是手机访问还是PC端访问网站

    <script>    if ((navigator.userAgent.match(/(iPhone|iPod|Android|ios|iOS|iPad|Backerry|WebOS|S ...

  5. MySQL中哈希表

    也称为散列表 由直接寻址表改进而来.先看直接寻址表 当关键字的全域U比较小时,直接寻址是一种简单而有效的技术.加入某应用要用到一个动态集合,其中每个元素都有一个取自全域U={0,1,...,m-1}的 ...

  6. Python3.6全栈开发实例[006]

    6.检查传入字典的每一个value的长度,如果大于2,那么仅保留前两个长度的内容,并将新内容返回给调用者. dic = {"k1": "v1v1", " ...

  7. Python是如何进行类型转换的?

    函数                      描述int(x [,base ])         将x转换为一个整数long(x [,base ])        将x转换为一个长整数float(x ...

  8. 解决后台无法进入提示DedeCMS Error: (PHP 5.3 and above) Please set 'request_order' ini value

    最近小美眉的网站被盯上了,被添加了非常多的dubo页面,删除了5w多个文件,但还是不停的增加,因为网站权重还可以,很多都被收录了,结果可想而知,ytkah帮她迁移,在迁移网站时遇到了一些问题,后台登录 ...

  9. 修改Linux的基本配置(修改主机名修改ip地址安装JDK/Tomcat/MySQL等等)

    (一)基本操作修改 修改主机名 vi /etc/sysconfig/network NETWORKING=yes HOSTNAME=server1.itcast.cn 修改ip地址 vi /etc/s ...

  10. 201704 F-47创建预付款申请a

    应该也是用 BAPI_ACC_DOCUMENT_POST