发现有一种奇怪的方法不能快速预处理?

复习一下常见的凑组合数的套路

You are given an array a of length n. We define fa the following way:

  • Initially fa = 0, M = 1;
  • for every 2 ≤ i ≤ n if aM < ai then we set fa = fa + aM and then set M = i.

Calculate the sum of fa over all n! permutations of the array a modulo 109 + 7.

Note: two elements are considered different if their indices differ, so for every array a there are exactly n! permutations.

Input

The first line contains integer n (1 ≤ n ≤  1 000 000) — the size of array a.

Second line contains n integers a1, a2, ..., an (1 ≤  ai ≤  109).

Output

Print the only integer, the sum of fa over all n! permutations of the array a modulo 109 + 7.


题目大意

题目分析

主要是记一下一种凑组合数的常见套路,网上其他人都是一种另外的考虑方式。

对于数$a_q$枚举它每一个出现位置的贡献,记严格小于它的数有$m$个,则有$a_q\sum\limits_{p=1}^n{m \choose {p-1}}(p-1)! (n-p)!$即$a_q m!\sum\limits_{p=1}^n{{(n-p)!}\over {(m-p+1)!}}$。于是就会发现右边这个东西分子分母都有自变量,看上去很难处理,但形式上又是有些相似的感觉。

式子可以接着这么化:$a_qm!(n-m+1)!\sum\limits_{p=1}^n{{n-p}\choose{n-m-1}}$,也就是把右式做成一个组合数。

注意到新的右式是经典问题组合数的列前缀和,于是化成:$a_qm!(n-m+1)!{{n}\choose{n-m}}$

最后化简得到:$a_qn!\over{n-m}$

 #include<bits/stdc++.h>
#define MO 1000000007
const int maxn = ; int n,ans,cnt,a[maxn],fac[maxn],inv[maxn]; int read()
{
char ch = getchar();
int num = , fl = ;
for (; !isdigit(ch); ch=getchar())
if (ch=='-') fl = -;
for (; isdigit(ch); ch=getchar())
num = (num<<)+(num<<)+ch-;
return num*fl;
}
int main()
{
n = read();
for (int i=; i<=n; i++) a[i] = read();
std::sort(a+, a+n+);
fac[] = fac[] = inv[] = inv[] = ;
for (int i=; i<=n+; i++)
inv[i] = MO-1ll*(MO/i)*inv[MO%i]%MO,
fac[i] = 1ll*fac[i-]*i%MO;
for (int i=,j; i<=n; i=j+)
{
for (j=i; a[j+]==a[i]; j++);
if (j==n) break;
cnt = inv[n-i+];
ans = (1ll*ans+1ll*a[i]*(j-i+)%MO*cnt%MO)%MO;
}
printf("%d\n",1ll*ans*fac[n]%MO);
return ;
}

END

【计数】cf938E. Max History的更多相关文章

  1. [CF938E]Max History题解

    题面 >CF传送门< >洛谷传送门< 解法 显而易见,对于一个数\(a_i\),若果它出现在\(f\)序列中,必定\(a_i\)之前的元素要小于\(a_i\),我们设\(cnt ...

  2. 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 ...

  3. 2018.12.12 codeforces 938E. Max History(组合数学)

    传送门 唉最开始居然把题给看错了. 其实是组合数学傻逼题呢. 题意简述:给出一个数列,定义一个与数列有关的fff函数,fff函数定义如下: 首先f=0,M=1f=0,M=1f=0,M=1,一直重复如下 ...

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

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

  5. CodeForces 938E Max History 题解

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

  6. 如何解决Redis中的key过期问题

    最近我们在Redis集群中发现了一个有趣的问题.在花费大量时间进行调试和测试后,通过更改key过期,我们可以将某些集群中的Redis内存使用量减少25%. Twitter内部运行着多个缓存服务.其中一 ...

  7. [SQL入门级] 接上篇,继续查询

    距离上一篇时间隔得蛮久了,这篇继续查询,简单总结一下聚合函数.分组的知识. 一.聚合函数(组函数/多行函数) 何谓多行函数,顾名思义就是函数作用于多行数据得出一个输出结果,什么意思呢?看图: 那么常用 ...

  8. SQL基本语句以及示例

    基本语句: /*dorp colunm*/ 语法:ALTER TABLE 表名   DROP COLUMN 要删除的字段 验证财务转换的正确性,查询以下两个表是否有数据 /*表连接inner jion ...

  9. python——使用readline库实现tab自动补全

    Input History readline tracks the input history automatically. There are two different sets of funct ...

随机推荐

  1. htmlunit最具有参考意义项目

    ### HtmlUnit What? - 项目1 https://gitee.com/dgwcode/spiderTmallTradeInfo - 项目2 https://gitee.com/dgwc ...

  2. Eclipse设置代码模板Code Template

    团队协作最好是使用相同的代码模板 Code Template,打开 Window -> Preference -> Java -> Code Style -> Code Tem ...

  3. 利用git reflog找回错误的重置

    在开发中经常需要reset分支,如果在reset前没有记住分支指向的提交ID,想要重置回原来的提交恐怕大多数开发者是重新拉取远程版本库,再rebase分支.但如果连不上远程版本库或没有远程版本怎么办呢 ...

  4. mybatis批量处理sql

    转载大神 https://www.cnblogs.com/xujingyang/p/8301130.html

  5. 15-----jQuery补充

    jquery除了咱们上面讲解的常用知识点之外,还有jquery 插件.jqueryUI知识点 jqueryUI 官网: https://jqueryui.com/ jqueryUI 中文网: http ...

  6. opencv——IplImage结构

    一.作业要求: 采用MATLAB或opencv+C编程实现.每一题写明题目,给出试验程序代码,实验结果图片命名区分并作出效果比对,最后实验总结说明每一题蕴含的图像处理方法的效果以及应用场合等. 采用M ...

  7. Java8 如何正确使用 Optional

    原文出处:https://blog.kaaass.net/archives/764 Optional是Java8提供的为了解决null安全问题的一个API.善用Optional可以使我们代码中很多繁琐 ...

  8. ABAP:从例子学习ABAP

    1.插入内表行: *插入内表行: DATA: BEGIN OF man, name(20) TYPE c, high TYPE p DECIMALS 2, weight TYPE p DECIMALS ...

  9. Oracle SQL Developer-3.2.20.09.87 Windows 10启动问题处理&配置

    用了好多年的工具,准备在笔记本上使用时启动不了,但在办公室PC上可以正常使用.两者电脑OS都一样,一个是全新安装.一个是从Windows 7升级而来.下载了最新版发现版本到17了,Oracle刷版本号 ...

  10. C# 执行可执行文件

    可以用C#脚本执行可执行文件,一般可以用C# IO流写出.bat脚本,然后顺带执行脚本,然后滑稽.三连... Process proc = null; try { proc = new Process ...