成绩比较

这道题目虽然是放在容斥原理题单里面的,但实际上用的是二项式反演(当然这东西也是由容斥原理推导出来的)

但是啦我已经很满足了,我自己已经推出了大部分的式子了,只是最后不会二项式反演而已

这种没什么思路的题目,我们先从小范围开始想起

我们假设只有一门课,那么我们从n1个同学中选出k个人(Cn1k),表示这些人被B神碾压,那么剩下的n1k个人的成绩都严格大于B神。我们假设B神的成绩是g,那么答案就是Cn1kgk(ug)n1k(注意要满足B神的排名与被碾压的人数不矛盾)

现在我们来看看有两门课。我们先从第一轮考虑,我们先选出r11个人(Cn1r11)表示这些人的成绩严格大于B神,那么剩下的nr1个人就是在这门课中成绩没有超过B神的人。那么我们对第二门课做同样的操作,然后我们来判断是否符合条件。我们发现,当一个人在两门课都没被选择的时候,他才会被B神碾压,也就是说,我们设第一门课中选出的r11个人的集合是S1,第二门课选出的r21个人的集合是S2,那么我们需要满足k=n1|S1S2|

然后我们推广到三门课,有k=n1|S1S2S3|,然后我们就可以推广到m门课了

也就是说,先选择k个人表示这k个人不在任何一个Si里面,而且最后要有|Si|=n1k

我们先选择k个人,很显然,为Cn1k

然后我们来考察满足|Si|=n1k的所有的方案数,这东西就要用到二项式反演了。有关二项式反演

然后我们发现我们整体的结构就已经确认好了。假设我们现在已经有了B神的成绩,分别为(g1,g2,...,gm),那么选出的k个人的第i门课的成绩就有gi种选择,没被选出来的n1k个人第i门课的成绩就有uigi种选择,我们根据乘法原理乘起来就好了(这其实是非常重要的一个点,感觉很多容斥的题目,或者说计数的题目,当结构不同的时候,贡献是一样的,所以我们只用计算结构的数量就好了,比如这道题目,我们并不关心这k个人具体是谁,因为只有数量是一样的,贡献就一样)

但是还有个问题,我们不可能枚举每一个g,这个时候就可以看这篇题解

update 2024.5.3

没想到我居然把所谓的二项式反演自己推出来了。。还是挺开心的(当然具体的二项式反演还没有学,有空了学一下)

最后放的那篇题解有笔误,下文会说明

首先老规矩,跟上文叙述的思考过程一样,直接跳到二项式反演那里

其实现在就是要在剩下的n1k个人当中分配成绩,使得不存在任何一个人被B神碾压而且每门课都符合B神的排名

我们先忽略不被B神碾压的条件,来考虑每门课都符合B神的排名的所有的情况

那么总数显然就是i=1mCn1kri1(uigi)ri1ginkri。这个式子的意思是,依次考虑每门课,对于当前考虑的这门课,选出ri1个人,这些人的成绩严格大于B神

然后用容斥减掉不合法的情况。设Pi表示这n1k个人中第i个人被B神碾压的方案的集合,那么答案就是用上面说的总数减去|P1P2...Pn1k|

后面那个式子用容斥原理展开即得

i=1T(1)i1Cn1ki(g1g2...gm)ij=1mCnk1irj1(ujgj)rj1gjnkirj

其中T是上界

这个式子的意思是,我们从n1k个人中选出i个人来表示这i个人被B神碾压(Cn1ki),并且枚举他们的成绩((g1g2...gm)i),然后在按照最开始的选法依次考虑每一门课(j=1mCnk1irj1(ujgj)rj1gjnkirj)即可

然后将三部分化简之后得到答案

Cn1k×j=1m(gj=1ujgjnrj(ujgj)rj1)×i=0T(1)iCn1kij=1mCnk1irj1

然后三个部分分别计算就好了

然后最后一个问题就是我们不可能枚举B神的成绩gi,怎么办?

实际上利用最后贴的题解就好了

我们只考虑某一门课i,假设我们已经定下来了所有人的成绩,分别是h1,h2,...,hn,那么统计h中不同数字有多少个,记为t个,那么这t个数字肯定可以从ui个数字中选出,即Cuit,然后我们就可以建立一个映射了。也就是说我们枚举t,从ui个数中选出t个数,然后让所有人的成绩只能从这t个数中选择,把所有情况加起来就是答案了。但是我们直接枚举的话不能保证我们选取了t个数之后,这t个数的每一个数都会被选择,此时要用题解中说的容斥去解决(而且这个容斥挺新的,可以学一学)。但是题解中的公式错了,

这个最后不要乘以Cut,而是在统计答案的时候乘以Cut,可以想一下为什么,具体见代码

posted @   最爱丁珰  阅读(7)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示