传送门

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

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

题意简述:给出一个数列,定义一个与数列有关的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. Python+Selenium学习--窗口切换及操作元素

    场景 有时候我们在测试一个web 应用时会出现多个浏览器窗口的情况,在selenium1.0 中这个问题比较难处理.webdriver 提供了相关相方法可以很轻松的在多个窗口之间切换并操作不同窗口上的 ...

  2. 图片Bitmap在本地的存储与读取 File

    将Bitmap存储到本地: public void SaveImage(Bitmap image, String user_id){ //照片通常存在DCIM文件夹中 String sdCardDir ...

  3. gdb打印C++容器

    将以下内容保存成 .gdbinit 文件放到你的根目录,或者在gdb中source这个文件可以加载. 直接print容器即可. # # STL GDB evaluators/views/utiliti ...

  4. [剑指Offer]45-把数组排成最小的数

    题目链接 https://www.nowcoder.com/practice/8fecd3f8ba334add803bf2a06af1b993?tpId=13&tqId=11185&t ...

  5. linux命令学习之:tar

    tar命令可以为linux的文件和目录创建档案.利用tar,可以为某一特定文件创建档案(备份文件),也可以在档案中改变文件,或者向档案中加入新的文件.tar最初被用来在磁带上创建档案,现在,用户可以在 ...

  6. JQuery UI之Autocomplete(4)多值输入、远程缓存与组合框

    1.多值输入 首先加入相关的css和js文件,以及对应的HTML代码如下: <link href="../css/jquery-ui.css" rel="style ...

  7. 线特征---LSD算法(二)

    上一节介绍了一些资源和实验结果,这节主要是介绍LSD算法理论. 直线段检测算法---LSD:a Line Segment Detector LSD的核心是像素合并于误差控制.利用合并像素来检测直线段并 ...

  8. js原生语法实现表格操作

    HTML页面: <!doctype html> <html lang="en"> <head> <meta charset="U ...

  9. overflow visibility opacity(透明度) vertical-align 等等

     一,overflow属性:   1,四个值:    visible     默认值.内容不会被修剪,会呈现在元素框之外.    hidden        内容会被修剪,并且其余内容是不可见的.   ...

  10. 故障处理分析:华为5885v3 cable/ Interconnect (LEFT Panel)

    故障现象: 处理结果: 1.重新把插左前面板,重启,故障消失.