CF938E Max History
时间:2021-07-13
本文章向大家介绍CF938E Max History,主要包括CF938E Max History使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
Link
Solution
考虑每个元素的贡献。该元素对答案有贡献当且仅当前面没有比该元素大的数,且后面存在比该元素大的数。容易想到先将序列排序。
假设所有元素都不同,当前是第 \(i\) 个,枚举该元素前面的数的个数,然后计数
\[\sum_{k=0}^{i-1} k!(n-k-1)!\binom{i-1}{k}
\]
然后就会发现 \(k!(n-k-1)!\) 是个常数列,记为 \(f_k\)。然后就会发现上面的式子是 \(f\) 和 \(1\) 的 egf 的二项卷积。NTT 一下就做完了。(但是模数是 1e9+7,这种方法并不可取)
还是太年轻了。
由于 \(f_k\) 这个东西很特殊,所以应该先考虑化简。注意到有
\[k!(n-k-1)!=\frac{k!(n-k-1)!(n-1)!}{(n-1)!}=(n-1)!\binom{n-1}{k}^{-1}
\]
所以就化成
\[(n-1)! \sum_{i=0}^{i-1} \binom{i-1}{k}\Big/\binom{n-1}{k}
\]
然后你就会发现这个和《具体数学》5.2 第一个例题长得差不多,大概就是考虑运用三项恒等式后再上指标求和。
最后便是
\[(i-1)!(n-i)!\binom{n}{i-1}
\]
然后再看有重复元素的。容易发现必须是第一个该值的元素才会造成贡献,所以只需要把所有同值元素按照第一个遇到的该种元素处理即可。
#include<stdio.h>
#include<algorithm>
using namespace std;
inline int read(){
int x=0,flag=1; char c=getchar();
while(c<'0'||c>'9'){if(c=='-') flag=0;c=getchar();}
while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+c-48;c=getchar();}
return flag? x:-x;
}
typedef long long ll;
const int N=1e6+7;
const int Mod=1e9+7;
int qpow(ll x,int y=Mod-2){
ll ret=1;
while(y){
if(y&1) ret=ret*x%Mod;
x=x*x%Mod,y>>=1;
}
return ret;
}
ll fac[N],a[N],inv[N];
ll C(int x,int y){return x<y? 0:fac[x]*inv[y]%Mod*inv[x-y]%Mod;}
int main(){
int n=read(); fac[0]=1;
for(int i=1;i<=n;i++)
a[i]=read(),fac[i]=fac[i-1]*i%Mod;
inv[n]=qpow(fac[n]);
for(int i=n-1;~i;i--)
inv[i]=inv[i+1]*(i+1)%Mod;
sort(a+1,a+1+n); int mx=a[n];
ll ans=0,q=0;
for(int i=1;i<=n;i++){
if(a[i]==mx) break;
if(a[i]!=a[i-1]) q=fac[i-1]*fac[n-i]%Mod*C(n,i-1)%Mod;
ans=(ans+a[i]*q%Mod)%Mod;
}
printf("%lld",ans);
}
原文地址:https://www.cnblogs.com/wwlwQWQ/p/15008647.html
- 众测备忘手册
- 我博客上的围棋js程序
- Laravel 开发 RESTful API 的一些心得
- Hive使用十六进制分隔符异常分析
- 智能家居系统结构
- 一个简单的完全信息动态博弈的解答
- Struts2远程代码执行漏洞S2-052 复现&防御方案
- CENTOS6.5安装CDH5.12.1(二)
- @ControllerAdvice + @ExceptionHandler 处理 全部Controller层异常
- 动态增加表单元素并获取元素的text和value提交
- SpringBoot常用配置
- Json格式String类型字符串转为Map工具类
- spring boot thymeleaf常用方式
- Java工具类- 跨域工具类
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法