传送门

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

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

题意简述:给出一个数列,定义一个与数列有关的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. 204. Count Primes (Integer)

    Count the number of prime numbers less than a non-negative number, n. 思路:寻找质数的方法 class Solution { pu ...

  2. c# 文件过大时清空原有内容重新写入

    FileStream fs = new FileStream("E:\\Test\\HistoryData.txt", FileMode.Append, FileAccess.Wr ...

  3. Class语法糖

    TypeScript源码 class A { hello() { } } class B extends A{ welcome() { } } TypeScript编译 var __extends = ...

  4. iOS开发时使用的bundle路径

    bundle是一个目录,其中包含了程序会使用到的资源. 这些资源包含了如图像,声音,编译好的代码,nib文件(用户也会把bundle称为plug-in). 对应bundle,cocoa提供了类NSBu ...

  5. swift - xcode10 - 点击事件交互BUG - (手势和button的addTarget方法)

    1. 现象button 点击闪退:没有任何原因 ,在听云检测上,显示 BUG2: 手势 没有任何作用,哪怕设置  isUserInteractionEnabled 和isEnabled 为true 都 ...

  6. cmd乱码问题

    1.进入 cmd 窗口 2.字符编码切换回中文:chcp 936 MS-DOS为以下国家和语言提供字符集:  代码页描述  1258 越南语  1257 波罗的语  1256 阿拉伯语  1255 希 ...

  7. 使用python语言计算n的阶乘

    计算“1x2x3x4” def factorial(n): result = n ,n): result *= i return resultdef main(): print factorial(4 ...

  8. ApplicationContextAware的使用

    一.这个接口有什么用? 当一个类实现了这个接口(ApplicationContextAware)之后,这个类就可以方便获得ApplicationContext中的所有bean.换句话说,就是这个类可以 ...

  9. Swift 小技巧 || 老偏方

    自己平时用的时候,或者看别人有一些好用的技巧分享一下,希望大家能get到 1.关于颜色 2.关于标记 // TODO:这样的标记XCode8才有的 // FIXME:这个也是XCode8有的

  10. 关于EOF:

    请先看下面一段程序: #include"stdio.h" int main() { ],t; int i,j; while(scanf("%s",a)!=EOF ...