题意

给出一个长为n的序列,对于这个序列的任意一个排列,求∑fa\sum f_a∑fa​的值。

题解

我们枚举每一个aia_iai​然后,计算aia_iai​出现了多少次,然后把ai∗numa_i*numai​∗num加入到ans里面。
考虑aia_iai​什么时候出现。
aia_iai​出现的位置前面的aja_jaj​必须严格小于aia_iai​,这样aia_iai​才能被取到,而且aia_iai​后面一定要有比它大的数,这样才能aia_iai​取到。
假设小于aia_iai​的数有mmm个,那么numm=∑r=0mCmr∗r!∗(n−1−r)!num_m = \sum_{r = 0}^mC_m^r*r!*(n-1-r)!numm​=∑r=0m​Cmr​∗r!∗(n−1−r)!
整个的公式就是:
∑i=1nai∗numi\sum_{i = 1}^na_i*num_i∑i=1n​ai​∗numi​
但这样暴力求的话时间复杂度是O(n2)O(n^2)O(n2),因此必须运用公式变换上述式子,可以证明numinum_inumi​可以在O(1)O(1)O(1)的时间求出来,具体求解方法见下图。

题解

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
#define pr(x) cout<<#x<<":"<<x<<endl
const int maxn = 1e6+10;
typedef long long ll;
const ll mod = 1e9+7;
ll a[maxn],fac1[maxn],fac2[maxn];
int n;
int main(){scanf("%d",&n);for(int i = 0;i < n;++i)scanf("%lld",&a[i]);sort(a,a+n);fac1[0] = 1;fac2[n+1] = 1;fac2[n] = n;for(int i = 1;i <= n;++i)fac1[i] = fac1[i-1]*i%mod;for(int i = n-1;i >= 1;--i)fac2[i] = fac2[i+1]*i%mod;ll ans = 0;for(int i = 0,j = 1;i < n && a[i] != a[n-1];i = j){for(j = i;a[i] == a[j];j++);ll num = j-i;ans = (ans + num*((a[i]*fac1[n-i-1]%mod)*fac2[n-i+1]))%mod;}cout<<ans<<endl;return 0;
}

codeforces 938E MaxHistory 组合数学相关推荐

  1. Dreamoon Likes Sequences CodeForces - 1330D(组合数学+位运算)

    Dreamoon likes sequences very much. So he created a problem about the sequence that you can't find i ...

  2. Permutation Partitions CodeForces - 1326C(组合数学+思维)

    You are given a permutation p1,p2,-,pn of integers from 1 to n and an integer k, such that 1≤k≤n. A ...

  3. Ayoub's function CodeForces - 1301C(组合数学)

    Ayoub thinks that he is a very smart person, so he created a function f(s)f(s), where ss is a binary ...

  4. 【cf】Codeforces 题解等汇总

    [cf]Codeforces Round #774 (Div. 2) 前4题 [cf]Codeforces Round #774 (Div. 2) 前4题_legend_yst的博客-CSDN博客 [ ...

  5. 2022年5月8号补题

    title: 5月8号补题 date: 2022-05-08 10:37:59 author: "胡耀文" categories: "算法" tags: &qu ...

  6. Codeforces 815 B Karen and Test 杨辉三角 组合数学

    题目链接: http://codeforces.com/problemset/problem/815/B 题目描述: 给你n个数, 让你求第一个数加第二个数 + 第二个数减第一个数 + ...... ...

  7. Codeforces - 466C - Number of Ways - 组合数学

    https://codeforces.com/problemset/problem/466/C 要把数据分为均等的非空的三组,那么每次确定第二个分割点的时候把(除此之外的)第一个分割点的数目加上就可以 ...

  8. CodeForces - 1523E Crypto Lights(组合数学+推公式)

    题目链接:点击查看 题目大意:给出 nnn 个初始时熄灭的灯泡,每次操作会等概率打开一个灯泡,当每 kkk 个连续的灯泡中出现了大于一个亮着的灯泡时停止操作,问期望操作次数是多少 题目分析:组合数学题 ...

  9. CodeForces - 560E Gerald and Giant Chess(组合数学+dp)

    题目链接:点击查看 题目大意:给出一个 n∗mn*mn∗m 的矩阵,其中有 kkk 个坏点,每次只能向右走或向下走,问从点 (1,1)(1,1)(1,1) 到点 (n,m)(n,m)(n,m) 共有多 ...

最新文章

  1. php 字符串转时间戳_php如何将时间字符串转换为时间戳
  2. python压缩文件夹下的所有文件_python压缩文件夹内所有文件为zip文件的方法
  3. acwing算法题--不同的数
  4. @Autowired静态变量
  5. 亿级别记录的mongodb批量导入Es的java代码完整实现
  6. 一个mybatis处理batch的插件,类似于pageHelper插件
  7. php+mysql案例含源码_【专注】Zabbix源码安装教程—步骤详解(1)安装前准备
  8. Linux学习之一-从三个重要人物的故事和一张思维导图说起
  9. java10支持mybatis_写了10年的代码,我最怕写Mybatis这些配置,现在有详解了
  10. 可禁用计算机服务,win10哪些服务可以禁用 服务哪些可以禁止启动
  11. 一图读懂马云与阿里20年:互联网巨头是如何养成的?
  12. linux函数进程撤销,Linux进程控制函数
  13. 移动应用开发——作业3
  14. Error: A JNI error has occurred, please check your installation and try again
  15. 牛年春节海报怎么设计?psd分层模板,给你灵感!
  16. java如何新建一个空的压缩包_如何在Java中创建zip文件
  17. 复旦的NLP——fudanNLP
  18. 安卓WindowManager注入事件如何跳出进程间安全限制
  19. 什么SEO内容可以吸引外部链接
  20. 如何分割cue+ape、cue+flac、cue+wav、cue+dts整轨音乐文件

热门文章

  1. linux误删ssh不上,误删openssh-server删除,复原操作
  2. ubuntu mysql集群搭建_ubuntu server部署mysql集群
  3. python小游戏——21点
  4. 『软件工程3』你应该知道的三种原型实现模型:抛弃式、演化式、增量式
  5. 基于PHPEnv的本地环境搭建—PHP第一个项目:HelloWorld(从安装到运行)
  6. 815 计算机专业基础综合,2018年华东理工大学信息科学与工程学院815计算机专业基础综合之计算机操作系统考研基础五套测试题...
  7. 小型数字系统---运动码表设计
  8. [蓝桥杯][基础练习VIP]Huffuman树
  9. hdu1873 看病要排队-优先队列
  10. 蓝桥杯2017初赛-打印大X-找规律