题目链接: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. 修改已生成项目app名称

    在搜索里添加product Name,然后修改成你需要的app名称 修改完后可能会报错误如下 原因是test的测试路径发生了变化,其实如果不修改Test host的路径保留原来的重命名之前的app也是 ...

  2. js对多行字符串的处理

    f = [] g = str(f) h = ''.join(f) dic_ = () gd = str(dic_) hd = ''.join(dic_) 0 老板1 北京2 上海3 天津4 重庆5 河 ...

  3. XShell安装(五)

    Xshell就是一个远程控制Centos的软件:(用XShell比较方便,试用的都知道,界面也人性化) 详细介绍请看 百度百科 我随便百度下载了一个中文版的 给下地址  http://rj.baidu ...

  4. 在ie和chrome浏览器中滚动条样式的设置

    1.IE下设置滚动条样式的属性 scrollbar-arrow-color: color; /*三角箭头的颜色*/scrollbar-face-color: color; /*立体滚动条的颜色(包括箭 ...

  5. ES6学习笔记(三)——数值的扩展

    看到这条条目录有没有感觉很枯燥,觉得自己的工作中还用不到它所以实在没有耐心看下去,我也是最近得闲,逼自己静下心来去学习去总结,只有在别人浮躁的时候你能静下心来去学去看去总结,你才能进步.毕竟作为前端不 ...

  6. spring security原理

    spring security通过一系列过滤器实现其功能,入口过滤器如下(web.xml): <filter> <filter-name>springSecurityFilte ...

  7. 序列化的两个模块(json和pickle)

    到底什么是序列化(picking)呢? 我们把变量从内存中变成可存储或传输的过程称之为序列化 序列化之后,就可以把序列化后的内容写入磁盘,或者通过网络传输到别的机器上. 反过来,把变量内容从序列化的对 ...

  8. Spring笔记:事务管理

    Spring笔记:事务管理 事务管理 Spring事务管理是通过SpringAOP去实现的.默认情况下Spring在执行方法抛出异常后,引发事务回顾,当然你可以用拦截器或者配置去改变它们. 这部门内容 ...

  9. Python框架之Tornado(概述)

    本系列博文计划: 1.剖析基于Python的Web框架Tornado的源码,为何要阅读源码? Tornado 由前 google 员工开发,代码非常精练,实现也很轻巧,加上清晰的注释和丰富的 demo ...

  10. PAT 天梯赛 L1-032. Left-pad 【字符串】

    题目链接 https://www.patest.cn/contests/gplt/L1-032 思路 要分两种情况处理 ①字符串长度 <= 填充长度 就在字符串前面输出(填充长度 - 字符串长度 ...