A - xor
题意
给定n,d,求
0≤x,y,z<n∑(x⊕y⊕z)d(mod998244353)
其中⊕表示按位异或。
n<230,d≤100000。
Sol
部分分:d≤10
下面是一个和正解毫无关系的暴力。
通过数位dp单独对二进制每一位进行考虑。考虑怎么算答案,设pi表示第i位是0还是1,由多项式乘法的组合意义可得:
(i=0∑lognpi2i)d=d!l1+l2+⋯+llogn=d∑i∏li!(pi2i)li
在dp状态中加入一维表示l1+l2+⋯lcur_len,就可以在O(logn⋅23⋅d2)的时间内解决问题。
正解
枚举x,y,z最高的和n不同的一位,假设为a,b,c。不失一般性地令a≤b≤c。x⊕y⊕z可能取到的数,满足c以上的位全部与n相同,c位为0且n的c位为1,c以下的位任意。考虑末c位取到某个L∈[0,2c)的方案数,发现我们可以先让x的末a位、y的末b位随便取,然后根据x,y和L唯一地确定z的末c位,故而方案数为2a+b。这也就是说,枚举完a,b,c之后,x⊕y⊕z的每一个可能的取值出现的方案数是一样的。所以只需要求出所有的可能取到的数的d次方的和就可以了。可能取到的数形成了一个连续的区间,是经典的自然数幂和问题。直接枚举a,b,c计算的复杂度为O(dlog3n),观察发现可取到的数形成的区间只与max{a,b,c}有关,所以只需要算logn次自然数幂和就可以了,复杂度O(dlogn+log3n)。
B - N门问题
题意
N扇门中有一扇门是有奖的。初始的时候A认为所有门有奖的概率是相等的。每一轮,A会在有奖概率最大的门中随机选择一扇,然后主持人会从没有被A选择且没有奖的所有门中随机选择一扇门打开。进行到第N−1轮时,A的选择就是他的最终选择。
现在你来当主持人,你可以决定(而不是随机地)每一次打开哪一扇没有被A选择且没有奖的门,问A最终选择的门后面有奖的概率最小是多少。假定A不知道你是托儿,即A仍然认为你是在随机选择门。
N≤1018
C - 区间匹配
题意
有两个长度为n的序列a[1⋯n],b[1⋯n]和两个非负整数la,lb(lb≤la),你需要求出一个1到n的排列{p},使得对于所有i都有a[i]≤b[p[i]]≤a[i]+la,在此基础上你需要最大化满足a[i]+lb≥b[p[i]]的i的数量,并输出最大化的结果。
n≤500000,a[i],b[i],la,lb≤500000,且保证存在合法的p。
Sol
考虑这样的一种贪心:从右到左考虑每一个a的元素,确定与它匹配的b[p[i]]。设现在还没有匹配过的元素中,最靠右的一个是b[x],以及最靠右且满足a[i]≤b[y]≤a[i]+lb的是b[y]。如果让a[i]匹配上b[y],剩下的点仍然存在合法的匹配,则让a[i]匹配b[y];否则让a[i]匹配b[x]。
正确性证明:假设这样得到的不是最优解,考虑最优匹配中第一个与这样求出来的匹配不同的位置i,如果i匹配的既不是x也不是y,将i匹配的改成x或者y,答案一定不会变劣;假设最优匹配中i匹配了y,则意味着让i匹配y之后仍然存在完备匹配,所以我们的贪心策略也会让i匹配y;而如果最优匹配中i匹配了x,我们的贪心策略让i匹配了y,设我们的贪心策略中匹配了x的是qx(显然qx对答案没有贡献),而最优策略中qx匹配z,则有两种情况:
- z≤y,则qx,z这一对有可能对答案产生了贡献,此时我们将最优决策改为x匹配qx,i匹配y,显然是不会变劣的。
- z>y,则qx,z这一对一定对答案没有贡献。继续考虑qz和最优策略中qz所匹配的w,若w≤y就改成qx匹配x,qz匹配z,i匹配y,答案不会变劣,因为用到的y的右侧的点的集合是一样的,并且用到的y的左侧的点(从w变成了y)没有向左移,而已经确定了的匹配的贡献也没有变小;否则,继续考虑qw直到匹配的点在y的左侧。
直接检查是否存在完备匹配是O(nlogn)的(排序+贪心)。由Hall定理可得,存在完备匹配的条件是,不存在z使得∑i[b[i]≥z]>∑j[a[j]+la≥z]。用线段树维护每个z的∑i[b[i]≥z]−∑j[a[j]+la≥z]以及区间最小值,并支持区间+1/−1,即可在O(nlogn)的时间内解决问题。