codeforces938E Max History 组合数学

博客详细介绍了Codeforces 938E问题的解决方案,该问题涉及到组合数学的应用。题目要求计算数组a所有排列中f(a)的总和,其中f(a)是在满足特定条件下的累加和。博主指出,关键在于理解每个元素的贡献次数,即找到大于等于该元素的子序列,并利用排列组合公式计算。最终,通过计算每个元素的贡献并使用逆元处理除法,得到问题的答案。
摘要由CSDN通过智能技术生成

题目链接:戳这里

题目大意:

我们定义f(a)为:
1、开始时,f(a)=0,M=1。
2、对于每个2<=i<=n,如果a[M]<a[i],那么f(a)=f(a)+a[M],M=i。
现在对于一个给定的数组a,求其所有排列的f(a)之和,答案对1e9+7取模。

题解:

一开始以为是把f(a)变成a[M],然后不会做。

后来发现是题看错了QAQ。

既然是加上,那么我们可以分开统计每个数的贡献。

如果一个数要有贡献,那么在这个排列中,排在该数前的数都比该数小,排在该数后的都比该数大--->也就是顺序排列。

所以一个数的贡献次数为:

(图从别的博客扒的)

也就是从n个位置中找n-i+1个大于等于该数的位置,其中该数在第一个位置,前i-1个位置和后n-i的位置的数都任意排列的值。

化简一下是n!/(n-i+1)。

那么一个数的贡献就是贡献次数*这个数*出现次数。

加起来即可ÿ

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值