题目链接: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. 转 谈谈JS里的{ }大括号和[ ]中括号的用法,理解后就可以看懂JSON结构了。

    一.{ } 大括号,表示定义一个对象,大部分情况下要有成对的属性和值,或是函数. 如:var LangShen = {"Name":"Langshen",&qu ...

  2. Java基础 - 流程控制语句

    package com.demo4; /* * 流程控制语句 * 流程控制语句分类: * 顺序结构 * 代码从上往下按照顺序执行 * * 选择结构 * if * if (关系表达式1) { * 语句体 ...

  3. 密码硬编码(Password Management: Hardcoded Password)

    在对项目进行安全扫描时,发现一些密码硬编码问题,本文主要三个方面:1)什么是密码硬编码:2)密码硬编码的危害:3)密码硬编码的解决方案. 一 什么是密码硬编码 将密码以明文的形式直接写到代码中,就是密 ...

  4. Windows下比较小巧的c/c++ ide

    下载:codeblocks 只有几十兆. http://www.codeblocks.org/downloads/26#windows codeblocks-16.01mingw-nosetup.zi ...

  5. 我的Android进阶之旅------>百度地图学习:BDLocation.getLocType ( )值分析

    BDLocation类,封装了定位SDK的定位结果,在BDLocationListener的onReceive方法中获取.通过该类用户可以获取error code,位置的坐标,精度半径等信息.具体方法 ...

  6. window.onload和$(document).ready()比较

    浏览器在页面加载完毕后,JS通常使用window.onload方法为DOM元素添加事件,而jQuery使用的是$(document).ready()方法.两者功能相似,但也有细微差异,下面简要对比一下 ...

  7. ASP.NET MVC string赋值Html格式在显示View问题总结

    ViewBag.Content = "<p>你好</p>"; string 类型的赋值一个 "<h1>你好</h1>&qu ...

  8. Java的变量命名

    Java的变量命名 1.首字母是英文字母.$和下划线,由字母.数字和下划线组成.  [很常规] 2.变量的命名遵循见名知义的原则.  [很重要,比如名字就用 name ,而不是用a.b.c这样的命名, ...

  9. Django工作小笔记

    场景一:如果model中字段用CharField,然而你想用数字(类似IntegerField)排序,此时可以用django的extra函数直接调用原生sql的CAST函数即可 Score.objec ...

  10. 爬虫基本库之beautifulsoup

    一.beautifulsoup的简单使用 简单来说,Beautiful Soup是python的一个库,最主要的功能是从网页抓取数据.官方解释如下: Beautiful Soup提供一些简单的.pyt ...