Codeforces 938E Max History:排列 + 逆元【考虑单个元素的贡献】
题目链接: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:排列 + 逆元【考虑单个元素的贡献】的更多相关文章
- CodeForces 938E Max History 题解
参考自:https://blog.csdn.net/dreaming__ldx/article/details/84976834 https://blog.csdn.net/acterminate/a ...
- 2018.12.12 codeforces 938E. Max History(组合数学)
传送门 唉最开始居然把题给看错了. 其实是组合数学傻逼题呢. 题意简述:给出一个数列,定义一个与数列有关的fff函数,fff函数定义如下: 首先f=0,M=1f=0,M=1f=0,M=1,一直重复如下 ...
- Selenium定位一 --单个元素定位方法
Selenium-Webdriver 提供了强大的元素定位方法,支持以下三种方法. 单个对象的定位方法 多个对象的定位方法 层级定位 定位单个元素在定位单个元素时,selenium-webdriver ...
- 定义一个Collection接口类型的变量,引用一个Set集合的实现类,实现添加单个元素, 添加另一个集合,删除元素,判断集合中是否包含一个元素, 判断是否为空,清除集合, 返回集合里元素的个数等常用操作。
package com.lanxi.demo2; import java.util.HashSet; import java.util.Iterator; import java.util.Set; ...
- Linq扩展方法获取单个元素
在使用Linq 提供的扩展方法时,First(OrDefault), Single(OrDefault), Last(OrDefault)都具有返回单个元素的功能.MSDN对这些方法的描述只有功能说明 ...
- python 列表删除元素,单个元素,多个连续或不连续元素
以列表a为例 import numpy as np a = ['上海市', '云南省', '内蒙古', '四川省', '天津市', '宁夏', '安徽省', '山东省', '山西省'] 删除单个元素 ...
- 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 ...
- BZOJ.4517.[SDOI2016]排列计数(错位排列 逆元)
题目链接 错位排列\(D_n=(n-1)*(D_{n-1}+D_{n-2})\),表示\(n\)个数都不在其下标位置上的排列数. 那么题目要求的就是\(C_n^m*D_{n-m}\). 阶乘分母部分的 ...
- CodeForces 57C Array 组合计数+逆元
题目链接: http://codeforces.com/problemset/problem/57/C 题意: 给你一个数n,表示有n个数的序列,每个数范围为[1,n],叫你求所有非降和非升序列的个数 ...
随机推荐
- SQLServer中exists和except用法
一.exists 1.1 说明 EXISTS(包括 NOT EXISTS)子句的返回值是一个BOOL值.EXISTS内部有一个子查询语句(SELECT ... FROM...),我将其称为EXIST的 ...
- log日志框架和LocationAwareLogger问题
遇到了同样的问题, 我的解决办法是在pom.xml中增加如下配置,去除对于jcl-over-slf4j.jar的依赖. <exclusions> <ex ...
- 微信小程序-学习总结(1)
微信小程序尺寸单位 rpx单位是微信小程序中css的尺寸单位,rpx可以根据屏幕宽度进行自适应.规定屏幕宽为750rpx. 设备 rpx换算成px(屏幕宽度/750) ...
- ApexSQL Recover 恢复一个被drop的表的数据
没有备份的情况下恢复一个被drop的表的数据 ApexSQL Recover 恢复一个被drop的表的数据 转自:https://solutioncenter.apexsql.com/zh/%E6%B ...
- SQL Server误删表查看
SQL Server误删表查看 转自:http://blog.51cto.com/aimax/2134572 SQL Server 完全恢复模式 下恢复误删除的表,进行 精准 恢复 1. 找出被 ...
- Eclipse中执行maven命令(转载)
转载自:http://blog.csdn.net/u011939453/article/details/43017865 1.如下图,右击需要执行maven命令的工程,选择"Debug As ...
- 剑指offer 面试32题
面试32题: 题目:从上到下打印二叉树 题:不分行从上到下打印二叉树 解题代码: # -*- coding:utf-8 -*- # class TreeNode: # def __init__(sel ...
- 极速Node.js:来自LinkedIn的10个性能提升秘籍
from:http://faylai.iteye.com/blog/1293194 1.避免使用同步的方法 nodejs 是基于单线程.为了让单线程能够处理高并发的请求,我们尽量要避免让线程等待,阻塞 ...
- window + document + height
jQuery(window).height()代表了当前可见区域的大小,而jQuery(document).height()则代表了整个文档的高度,可视具体情况使用. 注意当浏览器窗口大小改变 ...
- 深入浅出Node.js(下)
(五):Node.js的异步实现 专栏的第五篇文章<Node.js的异步实现>.之前介绍了Node.js的事件机制,也许读者对此尚会觉得意犹未尽,因为仅仅只是简单的事件机制,并不能道尽No ...