2020 年电子科技大学 ICPC 暑假前集训数学与几何专题题解
最后一个专题辣,结果到最后都没回成学校……前几个专题也都没写题解。
那就补一下最后一个专题的好了,有原题的还是会给出原题链接(
实际上原来是想插图的,但是感觉没啥意思,所以变成插 BGM 了,图就留在题解里了
题目简评
作为负责人还是有点义务谈谈这些题是怎么选出来的(并没有)。
对于数论部分,有 B, D, I, J, K, L, M 七道题,L 和 M 作为板子题不参与难度评价,剩下的题目中 B, I 两题比较简单,B 题的推导流程也可以作为入门推导过程。D 题涉及到结论证明与打表,可能对于刚接触的同学有些陌生。J 与 K 两题难度较大,其中 J 题是比较正统的数论题目形式,既要推大式子也要有一定的编码能力才能完成,若不熟悉
对于组合部分,有 C, G 两题,C 题作为一般的组合问题难度还是较为简单的,G 题作为容斥原理的问题,有一定的推导难度,但是与去年三道板子相比,今年组合部分的难度要比去年的大。但是没有第二类 Stirling 数和 Lucas 定理的题,前者可以直接去做去年的题(虽然是板子……),后者的使用隐藏在 D 题的结论证明中,但是证出来的人很少……
对于博弈部分,有 A 题和 F 题,其中 A 题作为简单博弈,几乎人人都过了,F 题是博弈与组合的结合问题,难度稍大,但是理解了 NIM-k 问题后作出转化,实际上统计答案的部分还是比较好想的。总体来说博弈论难度和去年持平。
对于几何部分,有 N, O, P 三题,三道题难度递增,其中 N 题难度相对较低,O, P 两题来自 JOISC,难度较高。其中 P 题的结论比较难,O 题编码上要注意一些东西。但是相较去年的三道板子,难度还是比去年大的。
对于新加入的多项式部分和数学杂项部分,多项式部分有 H, Q, R 三题,其中 Q 题难度在三道题中较低,R 题其次,H 题很难。数学部分的 E 题难度不高,但需要一定推导。
总体来说,每个部分的题目难度均覆盖了从简单到难的范围(虽然有些部分不好放题难度跨度有点大了……),最低难度是 A 题,最高难度是 H 题。个人认为作为训练题还是不错的,难度对于入门来说较高,但低于实际比赛难度。
A - kiafa hynne mea?
题目描述
给定一个包含
数据范围:
题解
结论是,数组内只要存在一个奇数,则 Alice 胜,否则 Bob 胜。
分三步考虑,如果数组中无奇数,那么 Alice 先手就无法操作,Bob 胜。
当奇数个数大于等于
考虑存在奇数个奇数,那么 Alice 第一次全拿走就好了,Alice 胜。
综上,当数组中奇数个数大于等于
来自 Codeforces Round #429 (Div. 2) B. Godsend。
时间复杂度:
Problem setter: Vingying
代码见这里
B- Was yant gagis chs hymmnos mea
题目描述
求
数据范围:
题解
由题可考虑枚举因数,因为与
其中
考虑
令
又已知
根据 Dirichlet 卷积的交换律与结合律,又可以写成
令
因为
这里的证明在 Möbius 函数介绍的时候基本都会讲,从略。
那么问题变成了
观察到数据范围给得很奇怪,大于
其实复杂度这样是
出题人表示这样是可以的,并没有卡。
我们枚举
复杂度更低的做法是利用 Pollard-Rho 进行质因数分解,但是 +jj 实现了一下发现比最朴素的暴力还慢不知道为啥(后来重写了一下跑得飞快)。
时间复杂度:
Problem setter: Vingying
C - yanje en yanje
题目描述
有一棵
数据范围:
题解
考虑对于所有节点均满足:这个节点的颜色和所有与这个节点相连的节点颜色均不同。把这棵树当成一棵有根树,那么可以发现,如果一个节点
因此 DFS 一下就好了。
来自 AtCoder Beginner Contest 133 E. Virus Tree 2。
时间复杂度:
Problem setter: Vingying
代码见这里
D - Fou ki ra
题目描述
求
其中,
数据范围:
题解
这道题是 Vingying 翻数论教材翻出来的题
结论有两个:
; ,其中 , 是一个奇数。
对于第一个等式详细证明已经遍地了,第二个等式是从四川大学数论教材课后习题里翻出来的(不过相信有很多同学打表打出来了……)。
第一个等式的证明从略,可自行参考网上文章。
对于第二个等式,根据条件,令
可知,
根据一条很显然的定理:若
下面我们证明上式左右两边相等。
设
将
可知,
根据 Lucas 定理
其中
有
由于
也就是说,对于任意一个奇质数
因为
那么合并之,有
由
可以说明,原式左右两边相等。
于是转化成了求:
显然直接求复杂度为
可以发现,我们求值的时候只用了少量 Fibonacci 数(
还是根据第二个等式,如果枚举
所以根据以上结论计算即可。
时间复杂度:
Problem setter: Vingying
代码见这里
E - nyamo!
题目描述
现在有三只杯子,一开始钥匙放在中间的杯子里,每一次都可以等概率地选择左右两个杯子中的一个与中间的杯子交换,求
数据范围:
题解
设
表示第
但是
配凑等比数列
可知
但是要求先化简,然后分子分母对
下面证明
分奇偶讨论,考虑扩展 Euler 定理。当
因为
因为
因此当
当
所以
因此当
综上,
那么对
综上,输出分子为
时间复杂度:
来自 Codeforces Round #362 (Div. 1) C. PLEASE。
Problem setter: Vingying
代码见这里
F - Afezeria!
题目描述
在一个长度为
数据范围:
题解
可以发现,黑棋只能向右走,白棋只能向左走,当黑白棋中间没有距离后即为死局。
这个可以划归到一个 NIM-k 问题,将一对黑白棋中间(无重复匹配)的格子看做一堆石子,就成了 NIM-k 问题了,现在要求先手必胜状态数。
回想 NIM-k 中先手必胜的条件:只要存在某一位
设
然后总情况减去必败情况即可。
时间复杂度:
Problem setter: Vingying
代码见这里
G - yasra dius manaf
题目描述
现有一
数据范围:
题解
对于二维容斥问题,我么可以类比一维情况实现。考虑有
这里还需要考虑
答案综合起来即为
后一个求和是
考虑化简前一个求和式,具体过程是一段数学杂技。
忽略系数,考虑提取公共项
考虑后一个求和类似二项式定理,逆用之。
这样我们可以得到第一个求答案的式子
题解写的其实是与其等价的形式。
来自 Codeforces Round #493 (Div. 1) C. Sky Full of Stars。
时间复杂度:
Problem setter: Vingying
代码见这里
H - Wassee fatere gyajlee deata
题目描述
一个环上有
数据范围:
题解
这道题是整个专题里最难的了,而我只会抄式子。(因为 xydg 想听 Vingying 讲这道题)
先将其看成两排长度为
设
其中
设
设
考虑枚举中间距离为
最后考虑环上的情况,也就是两边都是相对消除的情况,然后两边跨越这种点。设这部分权值为
可以发现,求
ldz, yyds!
来自 Codeforces Round #431 (Div. 1) E. Days of Floral Colours。
时间复杂度:
虽然我想直接放
因为有
Problem setter: Vingying
代码见这里
I - An Easy Math Problem I
题目描述
求
的值,
数据范围:
题解
看起来很好搞,首先只考虑
记
对于
对后面做一个前缀和,然后线性统计答案即可。
对于
其中
那么答案就是
约数个数,乘法逆元都是可以线性求出的,因此在线性时间复杂度下预处理所需值即可,每个回答都可以在常数时间内处理。
时间复杂度:
来自 洛谷 P4900 食堂。
Problem setter: qqq17770027225
代码见这里
J - An Easy Math Problem II
题目描述
求
的值,对
数据范围:
题解
仍然考虑枚举
有经验的话可以看出后面是一个经典求和,来自 JZPTAB 一题(BZOJ 2693)。
令
接着枚举因数
其中
即可以在两次数论分块的时间复杂度下求出,是线性的。
线性的肯定不行,所以考虑预处理掉
挺显然结果还是不行,考虑变换式子
交换求和顺序
考虑换一下字母。因为
利用线性筛可以预处理后面看起来很诡异的求和部分,因为是积性的。其实原来做个 结果卡上头了,std 754ms 时限 1s 实属屑题。
但是我写的这版时间 400ms 多,因为稍微加了点常数优化。
然后就可以利用筛出来的东西数论分块了。
时间复杂度:
bonus: 如果求和号有
Problem setter: qqq17770027225
代码见这里
类 Eratosthenes 筛代码见这里
K - An Easy Math Problem III
题目描述
求
的最小整数解。
数据范围:
题解
首先直接解模意义下解二次方程是错的,因为
那么我们将模数分解质因数,现在模数形式为
实际上,这个问题是求伪 Smarandache 函数
那么我们换一种考虑方式,显然我们求的是
再加入
更优的复杂度是枚举
最优的复杂度应该是对暴力枚举质因子的过程进行折半(选出了这个位置属于某个数,其余的自然属于另一个,并且这个过程是对称的),可以将指数位置除个
来自 Comet OJ - Contest #10 C. 鱼跃龙门。
时间复杂度:
草,你跟我说这事简单题
结合论文可以搞一堆特判。
Problem setter: qqq17770027225
代码见这里
L - Kanade Loves Calculator
题目描述
求方程
的最小非负整数解。
数据范围:
题解
扩展 BSGS 板子题,用 map 被卡了。
啥事扩展 BSGS 捏,用 BSGS 的时候发现
详细介绍可以参考网上博客或 BSGS - OI Wiki。
时间复杂度:
Problem setter: HeRaNO
代码见这里
M - Victorique aime les fonction
题目描述
给一个数列,多次询问某段形成的幂塔对
数据范围:
题解
看见幂次很大的形式,一般做法是利用扩展 Euler 定理降幂。
上式在
我们迭代
由于定理使用时要求指数部分大于
最后利用快速幂计算答案即可。
对于每次求
来自 Codeforces Round #454 (Div. 1, based on Technocup 2018 Elimination Round 4) D.。
时间复杂度:
Problem setter: HeRaNO
代码见这里
N - 地学部の部活
题目描述
求平面上
数据范围:
题解
考虑利用叉积表示三角形的面积,这样三角形是否平凡就不用处理了,但发现有个向量减法不好表示。
既然数据范围允许一种平方复杂度的做法,我们可以枚举原点,只计算与原点形成的三角形的面积和。现在就可以化成两个向量的叉积的形式之和了。
现在的问题转化成了平面上有
在实数域下,这个问题我们是有
先对
在二维向量空间中,由于叉积具有对加法的分配律,上述等式仍然成立。
但是取模没有任何性质,展开也是很困难的事情。如果让所有的叉积都是同号的,那么我们统计答案就可以直接去掉模长,将纵坐标加起来了。所以按照极角排序,让按以上顺序求值的所有向量叉积都是正的就可以了。
根据观察,为了避免重复统计答案,可以只统计枚举到的原点右侧的点与其构成的三角形面积和。
由于所有点坐标都是整数,所以面积之和的二倍一定是整数(两整数相乘一定是整数),那么面积和要么是整数,要么是整数加
来自 POI 2008 Triangles,BZOJ 1132。
时间复杂度:
Problem setter: HeRaNO
原来是想自己出一个的,然后就没有然后了
代码见这里
O - 地学部の部活 · 改
题目描述
平面上有
数据范围:
题解
如果两个三角形不相交,则一定可以做出两条内公切线,如果相交或内含是做不出内公切线的。三角形的公切线可以类比圆的公切线。
先枚举一个原点,记为
然后根据点枚举公切线,记枚举到的点为
统计完后转公切线,那么点
这样,可以发现,同一对三角形最终被统计了
来自 JOISC 2014 Day4 T1「2 人の星座」,LibreOJ #2882.。
时间复杂度:
Problem setter: HeRaNO
代码见这里
P - 地学部の部活 · 改二
题目描述
平面上有
- 所有点都被染色成
或 ; - 存在一种连线方式,使得相同颜色的点互相连通,并且构成一个星座的线段不与构成另一星座的线段相交。
求合法染色方案总数。
数据范围:
题解
结论是:一种染色方案合法,当且仅当这
这个结论是 IOI 2006 Points 一题提出的。
证明分两部分。必要性是显然的,枚举合法染色方案观察即可。
充分性证明如下:考虑对于一个不同色的非平凡三角形,则一定有一种颜色的点有一个,另一种有两个。将那种颜色唯一的点记为
可知,这个划分过程是有限的,并且一定会在合法状态停止的。
然后考虑一个凸包,由于两种颜色点分别连续,我们可以划分出两段连续区间,在区间内部所有点颜色均相同。对其我们一定可以进行一种三角剖分,使得任意三角形均为非平凡不同色三角形。
因此充分性成立,原命题得证。详细证明可以参考原版日文题解。
然后就是在凸包上转一圈染色,凸包内部的点均可以染两种颜色,两部分乘起来即可。
可能出现空集的情况,需要在代码中特判。
译自 JOISC 2012 Day2 T2「星座」,LibreOJ #6717.。
翻译完之后发现网上没有中文题解,也没看懂日文题解。看懂了之后发现网上已经有中文题解了……
时间复杂度:
Problem setter: HeRaNO
代码见这里
Q - 美食殿堂的副业
题目描述
给出一个数组
数据范围:
题解
可以分别考虑每个数作为第
首先对
朴素做法是
考虑如下变形:
显然这是一个卷积形式的式子,令
最后答案注意一下答案的位置(做完卷积之后还要将那个数组翻过来,这里是考虑
来自 HDU 5829. Rikka with Subset。
时间复杂度:
Problem setter: HeRaNO
代码见这里
R - 终章:真正的字符串
题目描述
定义字母的另一个顺序
数据范围:
题解
用 FFT 做的字符串匹配。用 bitset 被卡了,用定值 NTT 也被卡了(要对字母随机权值,这个视频有讲……)。
稍微需要一点复变函数的知识。
xydg:卡哈希大成功。
来自 Educational Codeforces Round 85 (Rated for Div. 2) G. Substring Search。
记
Problem setter: ZXyang
代码见这里