不知道谁给了没有看懂B题题面的我勇气滚去看C题。
本人的做法跟wangdy类似。(%%%真正的AK巨佬wangdy)
题目大意
同学们在教室传答案,却被老师逮个正着。
全班共有
n个同学,一学期共有
2n次考试,每次考试参与传答案的同学都不完全相同。老师每次考试有一半的概率记录这次考试参与传答案的同学名单,也有一半的概率当做什么也没发生。到了期末,老师检查一下自己记下的名单,找出每次都参与了传答案的同学,作为这学期的始作俑者。特别的,如果老师一学期没有记录任何一次考试的传答案名单,则没有学生是始作俑者。
老师对第
i个学生的惩罚系数是正整数
ai。期末抓出始作俑者之后,算出始作俑者人数
x和最大的惩罚系数
y,对全班施加的惩罚量
z=xy。特别的,如果没有学生是始作俑者,惩罚量为
0。
求期末惩罚量的期望
E(z) 。为了方便,输出
E(z)×22nmod998244353。
2⩽n⩽212。
思路
nodgd造得一手好数据,本人n方做法跑了4s。
一共有
2n次考试,每一次考试老师都有记录和不记录两种选择,总的情况就是
22n。于是最终答案就是所有情况的惩罚量之和。
考虑枚举始作俑者人数
x和最大惩罚系数
y,计算有多少种情况对应
x,y。记
c1[i]为惩罚系数
=i的人数,
c2[i]为惩罚系数
⩽i的人数。
x个始作俑者中一定有一个人惩罚系数
=y,且所有人的惩罚系数
⩽y。若
c2[y]<x,则合法情况数为
0。否则在
c1[y]个人中选出一个人当作惩罚系数最大的始作俑者,然后在另外
c2[y]−1个人中选出另外
x−1个人,方案数为
Cc1[y]1Cc2[y]−1x−1。但如果有多个人的惩罚系数都为
y,这样算就会算重。于是搞一波容斥:
k=1∑c1[y](−1)k−1Cc1[y]kCc2[y]−kx−k
当这
x个始作俑者确定以后,还要讨论其余
n−x人的情况。每次考试参与传答案的同学都不完全相同,意味着每次考试唯一对应
n个同学的一个子集。首先这
x个始作俑者一定都出现在老师记录名单的每一次考试中,这样的考试有
2n−x次(相当于去掉这
x个始作俑者,其余
n−x个同学的子集数),选择的方案数为
22n−x。但可能有其它的同学出现在选择出来的每一次考试中,而这些同学不是始作俑者,这种选法不合法,需要减掉。于是又搞一波容斥:
k=0∑n−x(−1)k⋅22n−x−kCn−xk
于是答案就出来了(
x=0时的惩罚量为
0,直接跳过):
ans=x=1∑ny∈ai∑(k=1∑c1[y](−1)k−1Cc1[y]kCc2[y]−kx−k)(k=0∑n−x(−1)k⋅22n−x−kCn−xk)xy
虽然有三层循环,但
y∈ai∑k=1∑c1[y]恰好把
n个同学全部枚举一遍,
k=0∑n−x与
y无关,因此可以做到
O(n2)。