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 解决,或者写无精度误差的方法。
The Art of Shaving Logs.
来自 OI Wiki 群友问的问题(大概 4 月份?),当时没人回答。
时间复杂度:
实际上本题仍可以将
附录一:证明
下面记
的实部。
我们考虑上式为等差乘等比,高考题之
上下两式作差
实际上前面的求和部分是一个
上式从复分析角度可知。
那么
请注意,
当
由此,
下面简单介绍需要的复分析知识(十分不严谨,仅供参考),如果已经学习过 FFT 或相关知识可以跳过。
根据 Taylor 展开可知
这就是 Euler 公式。根据此公式有
我们实际上就解出了所谓的「
我们首先来证明
我们考虑 Euler 公式
那么实部就是
关于
附录二:如何猜答案
先写个暴力打
对于
代码见这里
Violet mag Veilchen
题目描述
有一个半径为
数据范围:
题解
这里也有一些粗略的介绍。
一个很有意思的结论是,圆内(包括圆上)所有整数点形成的凸包规模并不大。究其原因,是因为函数较为平滑,考虑圆在第一象限内的图象,其二阶导的绝对值小于
留作课后作业后面再说)。实际上,圆内(包括圆上)所有整数点形成的凸包规模为
首先圆有很好的对称性,在这里我们仅考虑圆域位于第一象限的部分。最终答案就是第一象限的部分的答案乘
我们设
根据单调性,有
因为都是凸包上都是整数点,所以对于凸包的任何边,其斜率都是有理数。不妨设
我们的目的是求这样的一组
为了统计方便,因为我们要算的圆域是闭区域,我们需要把圆周也包括进来,所以考虑的凸包是能够完整覆盖这个圆的最小整点凸包。不妨设
如果
如果
,则下一个点就可以确定为 ,因为这样的话下一个点处圆的切线斜率更大,可以保证下一个点的下个点一定可以在圆外,从树的性质来说又可以保证满足要求,因此可以确定;- 否则,就表示凸包边的斜率大于切线处斜率。根据圆的一阶导和凸包性质,下一个点就会在圆内,所以扩大斜率的相反数,即
。
由于凸包的边的斜率是单调的,所以考虑用栈将每次递归到的分数存起来,就可以达到理想的复杂度了。
最前面有个问题,圆在第一象限内的部分二阶导绝对值小于 微积分 MATLAB
题,下面放一段过程,如果有问题就凑合看吧……
可知
易得
我们实际要解
分母恒正,移项,两边平方,去括号,移项,化为多项式,然后丢 MATLAB 解出来(考虑实根即可)
(实际上令
考虑不等号左边的单调性,可得范围为
易知
时间复杂度:
代码见这里
模拟人生 2077
题目描述
平面上
数据范围:
题解
对于求最大三角形,直接旋转卡壳即可。
对于求最小三角形,极角序是错的。这个方法以每个点为原点做点的极角序,统计极角序相邻的两个与原点形成三角形的面积取最小值。但需要注意最小三角形并不一定出现在极角序相邻的两个点,还需要考虑极径长度。
对于求最小三角形,考虑枚举每一条线段,用离这个线段最近的两个点更新答案。那么现在只有点到线段的距离有用了,考虑对线段按斜率排序,这里也可以利用极角序。对于排完序后的线段,因为现在只有点到线段的距离是我们需要考虑的,只要线段之间的相对位置不变即可。
考虑一种排序方式为按从
时间复杂度:
代码见这里