比赛链接
官方题解
Overview
- A. EhAb AnD gCd - 签到
- B. CopyCopyCopyCopyCopy - 签到
- C. Ehab and Path-etic MEXs - 关于树的构造题
- D. Ehab the Xorcist - 异或的一个性质
- E. Ehab’s REAL Number Theory Problem - 用图建模,找最短环,并且需要想办法优化时间
- F. Ehab’s Last Theorem - 图论,线段树
Problem A
给你一个[2,109]之间的整数x,请构造两个正整数a,b使得gcd(a,b)+lcm(a,b)=x.(gcd意为最大公约数,lcm意为最小公倍数.)
注意到gcd(1,x-1)=1且lcm(1,x-1)=x-1,所以令a=1,b=x-1即可.
Problem B
给你一个数组a,长度为n,n在[1,105]之间.现将数组a复制n份首尾相接得到一个新的长度为n2的数组b,问数组b的最长严格上升子序列是多长?
既然是严格上升子序列,那子序列里的数不可以重复,而数组b中最多有多少不重复的数字?a中有多少个不重复的数字,b里就有多少个不重复的数字.所以a中不重复数字的个数就是答案的上界,而且显然它总是可以取得的,因而就是答案.
Problem C
给你一棵树,节点个数n不超过105.请你将0,1,2,…,n-2这(n-1)个数一一分配给树的(n-1)条边.然后我们定义mex(u,v)表示从节点u到节点v的路径上 没有 出现过的 最小 自然数.所以对于这棵树中任意两个节点都可以计算一个mex值,你的问题是如何分配数字才能使得这棵树中所有mex值中最大的那个最小?给出分配方案.
树有这么一个性质,对于任意的2条边,你总是可以找到一条路径同时包含它们,但是对于任意的3条边却不一定了,比如连接在同一个点上的3条边.所以,无论你怎么分配数字,我都可以找到一个mex值≥2,只需要找到一条同时包含0,1的路径即可.这说明答案的下界是2.其实我们可以取得这个下界,方法是把0,1,2这3个数字分配到连接在同一个点的3条边上,从而无论哪条路径都不可能同时包含0,1,2,所以所有路径的mex值最大不超过2.如果没有3度节点呢?那这棵树就一定是一条链,而一条链无论怎么分配数字,最大的mex值都是n-1.
Problem D
给你两个在[0,1018]之间的整数u,v.请问最少需要几个非负整数,使得这些数的 异或和 为u, 算术和 为v?或者无解?
先考虑一个特殊情况.假如u和v的奇偶性不同,则无解,这是因为如果uv奇偶不同,那么它们的二进制的个位一个为1,一个为0,因而它们一个要求答案中2进制个位为1的有奇数个,另一个要求答案中2进制个位为1的有偶数个.
再考虑一个特殊情况,假如u>v,也是无解的,这是因为a⊕b≤a+b,可以推广,一堆数的异或和一定小于等于它们的算术和.
接下来,我们就不妨假设uv奇偶一致且u≤v了.
那么,[u,
v
−
u
2
\frac{v-u}{2}
2v−u,
v
−
u
2
\frac{v-u}{2}
2v−u]一定是一组满足要求的构造,因为
u⊕
v
−
u
2
\frac{v-u}{2}
2v−u⊕
v
−
u
2
\frac{v-u}{2}
2v−u=u⊕0=u,
u+
v
−
u
2
\frac{v-u}{2}
2v−u+
v
−
u
2
\frac{v-u}{2}
2v−u=v.
所以答案至多是3.
如果u=v=0,答案是0,如果u=v!=0,答案是1.
其他情况答案至少是2.
假设答案为2,即对于一组u,v,存在a,b使得a⊕b=u,a+b=v.
可以验证,异或有这么一个性质:a+b=a⊕b+2*(a&b), ⊕表示按位异或,&表示按位与.注意,这是一个恒等式,对于任意的a和b都是成立的.
于是我们有v=u+2(a&b),从而我们知道a&b= v − u 2 \frac{v-u}{2} 2v−u.
既然我们知道a⊕b和a&b,确定a和b各自是多少就是很简单的事情了,逐位确定即可,如果出现矛盾,则表明只用2个数是不够的,那么答案就是3.
Problem E
给你一个数组a,长度为n,n的范围是[1,105],数组a的每个元素的范围是[1,106].并且保证数组的每个元素至多有7个约数(包括1和它本身).现在问你,至少从这个数组中选出几个元素,使得它们的乘积是一个完全平方数?
注意到下面两点:
- 一个数如果只有不超过7个的约数,那么它最多有2个质因数.
- 将数组中的每个数约去自己的偶数次质因子,问题本质不变.
所以我们将每个数尽可能地除去偶数次质因子,那么处理后每个数只有3中情况:1或p或pq.(p和q是素数)
如果其中包含1,那么问题的答案就是1,就不必再处理了.
然后我们建图:节点是这些数涉及的所有素数再加上一个1,边是数组中的元素.具体来说,如果有一个数为pq,我们就连接pq,如果是p我们就连接1和p.
然后原问题就等价于找这个图中最小环的长度.(想一想为什么)
n个节点的图的最小环可以在O(n2)的时间做,方法是枚举每个点为起点做bfs.
但是这样会超时,于是我们需要想办法优化.
上述找环的方法有哪些计算冗余呢?如果按O(n2)的做法,每个环上的所有点都被当成起点做了一遍bfs,而事实上我们只需要保证每个环上至少有一个点被当成起点做了bfs就可以了.
而这个图有这么一个性质,不存在连接两个值都大于sqrt(m)的边,m是数组a中最大的数.因而任何一个环都不可能全是大于sqrt(m)的节点.所以我们只需要枚举不超过sqrt(m)的节点作为bfs的起点就可以了,而这些节点最多不超过1000个.
Problem F
给你一张图,节点数n在[1,105]之间,边数m在[1,2x105]之间.令sp=[sqrt(n)],中括号表示上取整.现在请你选择下面2个问题之一进行解决:1 找出这个图中的一个包含sp个点的独立集. 2 找出一个长度至少为sp的环.不用怀疑,因为我们总是可以证明这两个问题总是可以解决其中之一的.(点独立集是指一个点集中的点两两之间没有边相连)
图论中有这么一个结论:如果一张图中所有点的度数都不小于d,那么这张图中一定存在一个长度为d+1的环.
为什么呢?我们可以任选一个点作为起点,不断扩展出一条路径,直到无法扩展为止,为什么无法扩展呢?因为从最后一个点出发的所有边都连向这条路径上已有的点!而它的度至少为d,所以它至少连向了路径中的(d-1)个点,从而我们就得到了一个长度至少为d的环.
有了这个结论,再来说这道题的做法.
首先,我们找出图中度数最小的点,在图中删去这个点以及它所连接的点,不断重复这个操作,直到图中度数最小的点度数≥sp-1,接下来我们就可以找到一个长度为sp的环了.但是如果从始至终最小度数都小于sp-1呢?那么我们就能解决第一个问题!每次选中的那个点就是独立集中的点,首先,这些点肯定是相互独立的,其次因为每次删去的点的总数<sp,所以这种操作至少可以执行[n/(sp-1)]次(上取整),[n/(sp-1)]≥sp,所以至少可以选出sp个点相互独立.
用线段树模拟上述选点删点的过程就可以了.