2021, 2022 年电子科技大学 ICPC 暑假前集训数学与几何专题部分题解
只有部分题解,完整题解实在太多了,写不过来了(主要是不会)……
排序主要按难度和相关性,并没有按时间顺序和题号顺序排。
以下多组数据题目的时间复杂度均标注的是单组数据的时间复杂度。
黑灰游戏
题目描述
数据范围:
题解
如果
来自 Codeforces Round #425 (Div. 2) A. Sasha and Sticks。
时间复杂度:
代码见这里
黑灰游戏 · 改
题目描述
- 奇数轮由 Kate 指定一堆非空的石子堆开始。然后 Emilico 从这堆石子中拿走至少一个石子。
- 偶数轮由 Emilico 指定一堆非空的黑灰堆开始。然后 Kate 从这堆石子中拿走至少一个石子。
取走最后一个石子的一方获胜。两人均使用最优策略,请判断 Emilico 在这场游戏中是否一定可以获胜?
数据范围:
题解
设:
为只有一个石子的石子堆数; 为石子个数严格大于 的石子堆数; 为现在指定的石子堆的石子个数。
如果
下面讨论
- (W 态)
是偶数; - (L 态)
是奇数且 ; - (O 态)
是奇数且 。
下面我们将说明,只有 L 态是必败态,而 W 态和 O 态都是必胜态。
当
如果
如果
当
当
每个 W 态或 O 态都会引导对方进入 L 态或者
因此,先根据
改编自 CEOI 2021 Day2 T1。原题是一个交互,要求模拟这个过程。
时间复杂度:
代码见这里
Kanade Hates Modular Multiplicative Inverse
题目描述
给定
的一组最小解
数据范围:
题解
不妨考虑
这一方程,其中
由于
注意到
还有一个更简单一些的做法,复杂度和 Stern-Brocot 树相同。
时间复杂度:
代码见这里
Rust
题目描述
有一
对于给定正整数
的值,对
数据范围:
题解
先对式子变一下形
后半部分
这个板子实际上不想讲,主要是从多项式角度推的,但是我不会。详细推导过程可以看这篇日语博客。Min25 的博客关了,悲。
我们下面介绍一种会二项式定理就能推的方法。令
现在我们不想要这个
上一步化简中,由于
我们扰动了一下 ,是因为我们希望用二项式定理提出来
接着化简
我们看到后面的部分大概就像一个
容易发现,对于
实际上,当
下面我们只考虑
这里我们需要把
实际上,
那么我们考虑
这样,我们就可以在
求组合数也不需要杨辉三角,只需要
事实上,这个时间复杂度与使用上文提到的多项式板子的时间复杂度相同。
加强自 2017 年清华大学研究生招生计算机类上机考试 - 多项式求和。
时间复杂度:
代码见这里
天结
题目描述
对于两个计数器,每次先从
数据范围:
题解
令
对概率化简
而
实际上,所求答案为
注意到有
代入得
只考虑前半部分式子,注意到
分两部分考虑后面的和式,当
当
前面部分可以直接二项式定理逆用,后边考虑
那么合起来
注意到我们需要求的第二类 Stirling 数
时间复杂度:
代码见这里
新月之舞
题目描述
求
数据范围:
题解
我们分两段考虑
单独考虑后面的和式
对于
反向考虑
接着考虑
接着考虑枚举
其中
让我们把
使用数论分块求解即可。
求解时需注意除法能否整除,可以把后两项合并起来求和,就可以避免除 2 时的整数与否的判断了。因为答案级别是 __int128
。
来自 UOJ 群友某天问的一道题。
时间复杂度:
代码见这里
Жизнь по кругу
题目描述
现有一个半径为
数据范围:
题解
结论是,设
证明见 3B1B 的视频。
于是用 Pollard rho 分解质因数即可。
加强自 HAOI 2008. 圆上的整点
时间复杂度:
代码见这里
利兹与青鸟
题目描述
求
和
的值。
数据范围:
题解
这道题涉及一些复分析方面的知识,但不超过学了 FFT 的复分析知识范围。
对于求
下面考虑求
则
令
我们来考虑
不妨设现在要求的是
最终答案就是
了。
我们猜测
也可以简写为
在
考虑 Möbius 反演的一个补充结论
这里考虑
考虑如何变换交换和号,由于
则可提取与化简为
不妨设
则所求为
实际上,对于
我们对其的证明放在最后。则根据其结论可化简
我们就这样证明了上述猜测的正确性。
那么答案就是
其中
其中
可以在
因为整个不除以 double
的话将引入精度误差(即使除以 long long
转成 double
的时候精度误差就存在了),可以使用 long double
解决,或者写无精度误差的方法(但是要注意 C++ 对于负数除法并非向
The Art of Shaving Logs.
来自 OI Wiki 群友问的问题(大概 4 月份?),当时没人回答。
时间复杂度:
实际上本题仍可以将
附录一:证明
下面记
的实部。
我们考虑上式为等差乘等比,高考题之
上下两式作差
实际上前面的求和部分是一个
上式从复分析角度可知。
那么
请注意,
当
由此,
下面简单介绍需要的复分析知识(十分不严谨,仅供参考),如果已经学习过 FFT 或相关知识可以跳过。
根据 Taylor 展开可知
这就是 Euler 公式。根据此公式有
我们实际上就解出了所谓的「
我们首先来证明
我们考虑 Euler 公式
那么实部就是
关于
附录二:如何猜答案
先写个暴力打
对于
代码见这里
Violet mag Veilchen
题目描述
有一个半径为
数据范围:
题解
这里也有一些粗略的介绍。
一个很有意思的结论是,圆内(包括圆上)所有整数点形成的凸包规模并不大。究其原因,是因为函数较为平滑,考虑圆在第一象限内的图象,其二阶导的绝对值小于 留作课后作业后面再说)。实际上,圆内(包括圆上)所有整数点形成的凸包规模为
首先圆有很好的对称性,在这里我们仅考虑圆域位于第一象限的部分。最终答案就是第一象限的部分的答案乘
我们设
根据单调性,有
因为都是凸包上都是整数点,所以对于凸包的任何边,其斜率都是有理数。不妨设
我们的目的是求这样的一组
为了统计方便,因为我们要算的圆域是闭区域,我们需要把圆周也包括进来,所以考虑的凸包是能够完整覆盖这个圆的最小整点凸包。不妨设
如果
如果
,则下一个点就可以确定为 ,因为这样的话下一个点处圆的切线斜率更大,可以保证下一个点的下个点一定可以在圆外,从树的性质来说又可以保证满足要求,因此可以确定; - 否则,就表示凸包边的斜率大于切线处斜率。根据圆的一阶导和凸包性质,下一个点就会在圆内,所以扩大斜率的相反数,即
。
由于凸包的边的斜率是单调的,所以考虑用栈将每次递归到的分数存起来,就可以达到理想的复杂度了。
最前面有个问题,圆在第一象限内的部分二阶导绝对值小于 微积分 MATLAB 题,下面放一段过程,如果有问题就凑合看吧……
可知
易得
我们实际要解
分母恒正,移项,两边平方,去括号,移项,化为多项式,然后丢 MATLAB 解出来(考虑实根即可)
(实际上令
考虑不等号左边的单调性,可得范围为
易知
时间复杂度:
代码见这里
模拟人生 2077
题目描述
平面上
数据范围:
题解
对于求最大三角形,直接旋转卡壳即可。
对于求最小三角形,极角序是错的。这个方法以每个点为原点做点的极角序,统计极角序相邻的两个与原点形成三角形的面积取最小值。但需要注意最小三角形并不一定出现在极角序相邻的两个点,还需要考虑极径长度。
对于求最小三角形,考虑枚举每一条线段,用离这个线段最近的两个点更新答案。那么现在只有点到线段的距离有用了,考虑对线段按斜率排序,这里也可以利用极角序。对于排完序后的线段,因为现在只有点到线段的距离是我们需要考虑的,只要线段之间的相对位置不变即可。
考虑一种排序方式为按从
时间复杂度:
代码见这里