传送门

唉最开始居然把题给看错了。

其实是组合数学傻逼题呢。

题意简述:给出一个数列,定义一个与数列有关的fff函数,fff函数定义如下:

首先f=0,M=1f=0,M=1f=0,M=1,一直重复如下操作:在222~nnn中找到第一个比aMa_MaM​大的aia_iai​,然后f+=aM,M=if+=a_M,M=if+=aM​,M=i

求该数列n!n!n!个排列的fff函数之和。


这题一看就是统计每个数对答案的贡献次数。

具体说说就是看每个数在哪些排列中能有贡献。

于是考虑aia_iai​的贡献。

设严格小于aia_iai​的有lll个。

所以除了aia_iai​和那lll个数之外的数必须全部在aia_iai​之后出现才能使aia_iai​有贡献,这些数的排列种类数等于(n−l−1)!(n-l-1)!(n−l−1)!

然后考虑剩下的lll个数。

自身有l!l!l!种排列方式,考虑如何插空。

显然可以先把这lll个数位置选出来再安排剩下的。

于是ans=(nl)∗l!∗(n−l−1)!=n!n−lans=\binom n l*l!*(n-l-1)!=\frac{n!}{n-l}ans=(ln​)∗l!∗(n−l−1)!=n−ln!​

然后对每个数都统计一遍就行了。

代码:

#include<bits/stdc++.h>
#define ri register int
using namespace std;
const int N=1e6+5,mod=1e9+7;
typedef long long ll;
inline int read(){
	int ans=0;
	char ch=getchar();
	while(!isdigit(ch))ch=getchar();
	while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
	return ans;
}
int n,a[N],ans=0,fac[N],b[N],sig=0,siz[N];
inline int ksm(int a,int p){int ret=1;for(;p;p>>=1,a=(ll)a*a%mod)if(p&1)ret=(ll)ret*a%mod;return ret;}
inline int calc(int i){return (ll)fac[n-siz[i-1]-1]*ksm(n-siz[i-1],mod-2)%mod;}
int main(){
	n=read(),fac[0]=1;
	for(ri i=1;i<=n;++i)a[i]=read(),fac[i]=(ll)fac[i-1]*i%mod;
	sort(a+1,a+n+1);
	for(ri i=1;i<=n;++i)b[i]=a[i];
	sig=unique(b+1,b+n+1)-b-1;
	for(ri i=1,j=1;i<=n;++i){if(a[i]^b[j])++j;++siz[j];}
	for(ri i=1;i<sig;++i)siz[i]+=siz[i-1],(ans+=(ll)(siz[i]-siz[i-1])*b[i]%mod*ksm(n-siz[i-1],mod-2)%mod)%=mod;
	cout<<(ll)ans*fac[n]%mod;
	return 0;
}

2018.12.12 codeforces 938E. Max History(组合数学)的更多相关文章

  1. Codeforces 938E Max History:排列 + 逆元【考虑单个元素的贡献】

    题目链接:http://codeforces.com/problemset/problem/938/E 题意: 定义f(a): 初始时f(a) = 0, M = 1. 枚举i = 2 to n,如果a ...

  2. CodeForces 938E Max History 题解

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

  3. 2018年12月8日广州.NET微软技术俱乐部活动总结

    吕毅写了一篇活动总结,写得很好!原文地址是:https://blog.walterlv.com/post/december-event-microsoft-technology-salon.html ...

  4. 2018.5.12 storm数据源kafka堆积

    问题现象: storm代码依赖4个源数据topic,2018.5.12上午8点左右开始收到告警短信,源头的4个topic数据严重堆积. 排查: 1.查看stormUI, storm拓扑结构如下: 看现 ...

  5. Artificial Intelligence Computing Conference(2018.09.12)

    时间:2018.09.12地点:北京国际饭店会议中心

  6. China Internet Conference(2018.07.12)

    中国互联网大会 时间:2018.07.12地点:北京国家会议中心

  7. 20172319 2018.10.12《Java程序设计教程》第6周课堂实践(补写博客)

    20172319 2018.10.12 <Java程序设计教程>第6周课堂测验 课程:<程序设计与数据结构> 班级:1723 学生:唐才铭 学号:20172319 指导老师:王 ...

  8. 新手C#SQLServer在程序里实现语句的学习2018.08.12

    从C#中连接到SQL Server数据库,再通过C#编程实现SQL数据库的增删改查. ado.net提供了丰富的数据库操作,这些操作可以分为三个步骤: 第一,使用SqlConnection对象连接数据 ...

  9. [2018-11-27]2018年12月1日宁波dotnet社区线下活动

    离上次活动,转眼又过了一个月,幸得各路大神支持,于本周六(12月1日),宁波dotnet社区的线下分享活动又来啦! 活动嘉宾及主题 董斌辉 2015-2019年微软全球最有价值专家(.NET方向) 2 ...

随机推荐

  1. gitbook的学习

    gitbook安装与使用之windows下搭建gitbook平台 最近需要在GitBook中去阅读电子书 安装nodejs cnpm安装gitbook 解压书籍文件,并cd到书籍文件目录 gitboo ...

  2. sql case 与 sum

    <select id="selectTotal" resultType="java.util.Map" parameterType="java. ...

  3. [CodeForces_618C]Constellation

    题目链接 http://codeforces.com/problemset/problem/618/C 题意 给二维平面一些点的坐标,保证不是所有点都在一条直线上,各点不重合,输出三个点的id,满足其 ...

  4. js 定时执行

    代码: 格式例子: setInterval(方法名,1000*60); setInterval("方法名()",1000*60); setInterval(function () ...

  5. Memcached使用与纠错(附代码和相关dll)

    今天没事研究一下,谁想到遇到了几个dll找不到,网上也不好找到,索性功夫不负有心人.贴出代码和相关的dll Memcached代码:(网上都是的,很多人都保存了这个代码) using Memcache ...

  6. Vue vue.extend 和vue.component 两则之间的区别

    Vue.extend 返回的是一个 扩展实例构造器, 也就是一个预设了部分选项的Vue实例构造器 Var myExtend = Vue.extend({ //预设选项 })//返回一个 扩展实例构造器 ...

  7. 快速掌握Ajax-Ajax基础实例(Ajax返回Json在Java中的实现)

    (转)实例二:Ajax返回Json在Java中的实现 转自http://www.cnblogs.com/lsnproj/archive/2012/02/09/2341524.html#2995114 ...

  8. PDO 代码

    <?php try{ $dsn = "mysql:dbname=mydb;host=localhost"; $pdo = new PDO($dsn,"root&qu ...

  9. python自学开始

    95年工科女一枚 java工程师算不上,只能说从事java开发相关的工作,由于对Python有着极其浓厚的兴趣,一周时间了解大概之后,决定从今天开始见缝插针自学Python,为了防止本人三天打鱼两天晒 ...

  10. BZOJ 1791: [IOI2008]Island 岛屿 - 基环树

    传送门 题解 题意 = 找出无向基环树森林的每颗基环树的直径. 我们首先需要找到每颗基环树的环, 但是因为是无向图,用tarjan找环, 加个手工栈, 我也是看了dalao的博客才知道tarjan找无 ...