A
考虑用容斥解决问题。
排列数:n!
没有位置 pi=i 的排列数:1
恰好 2 位置 pi=i 的排列数:(2n)
恰好 3 位置 pi=i 的排列数:2(3n)
那么可以得到答案为 n!−1−(2n)−2(3n)。
B
结论:David 必胜。
证明:考虑归谬法。不妨假定 Adam 必胜,设 David 第一步选点 1 的时候 Adam 会选择点 x。那么 David 第一步直接选 x 即可获胜,所以假设不成立。
C
sol1
设精度限制 ϵ=10−9。
性质:最优的圆必然和一条边相切。如果不然,则由于所有点共线,可以向垂直于线的方向“挤”圆,使其贴到边上。
所以直接二分半径,对于一条边,每个点对应着一段开区间,代表切点不可能在这段区间内。对所有区间取并看有没有剩余的即可。注意要把两边的限制也判断进去。
几个优化:
- 由于当点的 x 坐标有序时,所有的区间的中点递增,所以可以不用每次二分判定的时候排序,可以少一个 log。
- 另一个性质是,圆的半径至少是 min(n,m)/4,因为将长方形横着切一刀,竖着切一刀分成四块,一条直线最多经过三块,另一块的最大圆就是下限。所以直接二分 logϵ−1 轮即可将相对误差减小到 o(ϵ)。
优化完后的复杂度为 O(klogϵ−1),不加优化也能过,但是会被卡精度,要开 long double,失策了,谢罪。
sol2
考虑分类讨论限制圆范围的因素。
核心即为判断 min(n,m)/2 的半径能否存在,显然圆心只有可能在一条线段上。
每个点对应一段区间,使得圆心不能在区间内。求区间并判一下即可。
对于一个角,对所有点计算以这个点为限制时的半径,取最小值即可。
注意到每个点的限制是一条抛物线,考虑将两条抛物线求交以后判断。
先特判掉 y1=y2 的情况(否则后面可能不是二次方程)以及 y=0 的情况(注意到这不优于第二类限制),然后就可以直接将两条抛物线的解析式求出来,作差以后用二次方程暴力解横坐标。也可以手推抛物线交点的式子,过程略,最后的结果是,对于两个点 (x1,y1) 和 (x2,y2),满足限制的圆交点的横坐标为:
x=y2−y1x1y2−x2y1±y1y2((x1−x2)2+(y1−y2)2)
对于每个可能的横坐标,用对应的解析式求出纵坐标(即半径)后再根据边的条件判断是否合法即可。
复杂度 O(k)。
D
令硬币的正面为1,反面为 -1,游戏结束等价于前缀和序列的极差 =n。
设 f(i,j) 表示极差为 i,目前前缀和比历史最小值大 j 时接下来 Rikka 的胜率,容易得到边界条件 f(n,0)=0,f(n,n)=1。
发现递推式子形式十分简单,直接展开即可。令 k=p1−p,则答案为 kn−1n−kn+1−1n+1。(注意特判 p=21)
具体的,我们定义一个数列 A1,A2,⋯,Am 是好的当且仅当对于 i∈[2,m−1] 有 Ai=pAi+1+(1−p)Ai−1。
容易发现下列数列是好的:
- f(i+1,0),f(i,0),f(i,1),⋯,f(i,i−1),f(i,i),f(i+1,i+1)
令 k=p1−p ,可以发现对于好的数列有 Ai+1−Ai=k(Ai−Ai−1)。
令 Fi=f(i,i)−f(i,0),有 Fi=Fi+1×∑j=0i+1kj∑j=1ikj
=Fi+1×1−ki+2k(1−ki)
=(1−kn+1)(1−kn)1×kn−i(1−ki+1)(1−ki)
而 f(i,0)−f(i+1,0)=∑j=1ikj1∗Fi=(1−kn+1)(1−kn)1−k∗(kn−i−1−kn)
f(0,0)=∑i=0n−1(f(i,0)−f(i+1,0))=(1−kn+1)(1−kn)(1−kn)−n(1−k)kn=kn−1n−kn+1−1n+1
E
令 fS,i 表示已经选了 i 个集合,还要选集合 S 的贡献之和。初始值是 fS,0=bS,答案即为 f∅,i。
依次从状态的点集合中剔除点 0,1,...,n−1,转移可以通过 FWT 优化,时间复杂度为 ∑i2(n−i)2i=O(n22n),可以通过。
F
比较套路的题。这式子是超几何函数,微分有限,所以 f(0),f(1),⋯,f(n) 可以写成整式递推的形式,暴力找出递推式后直接递推即可,时间复杂度 O(n)。