题目链接: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. eclipse java文件提示 The import XXX cannot be resolved

    问题:eclipse导入类   提示The import XXX cannot be resolved 原因:原来使用JDK和现在使用的JDK不同造成的buildpath不对 解決方法: 1.右键项目 ...

  2. Storm 集群安装

    http://archive.apache.org/dist/storm/  版本都在这 本人安装的是 其他版本的自行安装吧,估计都差不多 sudo mkdir /export/serverssudo ...

  3. Stolz–Cesàro theorem

    w http://planetmath.org/sites/default/files/texpdf/33795.pdf Stolz–Cesàro theorem - Wikipedia  https ...

  4. error C1853: “Debug\BigBuffer.pch”预编译头文件来自编译器的早期版本,或者预编译头为 C++ 而在 C 中使用它(或相反)

    <pre id="best-content-1299104064" mb-10"="" style="font-size: 14px; ...

  5. speech sdk 文字转语音

    1.下载SDK包 https://www.microsoft.com/en-us/download/details.aspx?id=10121 2.直接上代码 // SpeechRecognition ...

  6. Redis作者谈Redis应用场景(转)

    add by zhj : 这是Redis的作者antirez在他的技术博客中写的一篇文章 英文原文:take-advantage-of-redis-adding-it-to-your-stack 译文 ...

  7. 解决vsftp &quot;上传 553 Could not create file&quot;

    这个问题仅仅要:       1. setsebool -P ftpd_disable_trans 1       2. service vsftpd restart       太纠结了,呵呵

  8. hive 安装警告 WARN conf.HiveConf: HiveConf of name hive.metastore.local does not exist

    解决方法: 在0.10  0.11或者之后的HIVE版本 hive.metastore.local 属性不再使用. 在配置文件里面:  <property>  <name>hi ...

  9. Android 4.4 Kitkat 音频实现及简要分析

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/jingxia2008/article/details/26701899 在 Android 4.4 ...

  10. [LeetCode-21]Construct Binary Tree from Preorder and Inorder Traversal

    Given preorder and inorder traversal of a tree, construct the binary tree. Note: You may assume that ...