CF 杂题选做 3月
CF1972D2
Tag:数论 gcd 2200
首先我们设 \(gcd(p,q) = 1\),
其中 \(pd=a,qd=b\)。
所以有 \(qd^2 | pd+qd\)。
化简得 \(qd | (p+q)\)。
又因为 \(gcd(p+q,q)= gcd(p,q)=1\)。
所以就是 \(d | (p+q)\),首先 \(p = \frac{a}{d}\),所以有 \(d \leq \frac{a}{d}\)。
不难发现 \(p\) 这个数是根号级别的,然后 \(q\) 同理,所以时间复杂度是 \(O(\sqrt{n+m} \log A)\)。
CF1957E
Tag: Lucas定理 威尔逊定理 数论 2400
首先考虑这个 \(C(i,j)\) 是多少,显然是先弄出一个排列,然后会算重 \(j\),所以 \(C(i,j) = \tbinom{i}{j}(j-1)!\)。
然后因为要求 \(C(i,j) \mod j\),我们猜测值不为 \(0\) 的函数值不会很多。
根据威尔逊定理可以知道 \((j-1)! = (j-1) \mod j\),
再考虑 \(\tbinom{i}{j} \mod j\) 可以用 Lucas 定理化成 \(\lfloor \frac{i}{j} \rfloor\)。
最后的式子就变成 \(\sum_{j \in prime}\sum_{i=1}^{n}\lfloor \frac{i}{j} \rfloor (j-1)\)。
然后我们发现 \(j=4\) 的时候函数也是有值的,我们特判一下即可。
接着我们发现 \(\lfloor \frac{i}{j} \rfloor\) 会分成若干段相等的,所以我们只需要枚举质数 \(j\),然后枚举倍数,再用差分去做一个区间加法,最后求一遍前缀和即可。
CF1957F2
Tag:hash 权值线段树 2700
我们给每个颜色随机赋一个值,然后对于一个点维护根节点到这个点的线段树。
树上每个节点表示出现次数 \(c_i\) 与随机权值 \(w_i\) 的乘积。
然后每次询问,我们可以通过树上差分求得两条路径的线段树信息。
然后在线段树上二分即可,如果当前节点的 \(sum\) 相同,或者找到的颜色个数已经达到 \(k\),则可以直接 return,否则继续遍历两个儿子结点,因为找到一个节点的时间复杂度是 \(O(\log n)\),所以总复杂度是 \(O(nk\log n)\)。
CF1419E
Tag:构造 数论 2100
考虑把问题转化,如果一个数有 \(n\) 个质因数,设每个数拥有一个二进制特征值,即 \(p_i\),如果是第 \(j\) 个质因子的倍数,那么 \(p_i\) 的第 \(j\) 位就是 \(1\),否则是 \(0\)。
那么我们就要构造一个序列使得 \(p_i\) 和 \(p_{i+1}\) 在二进制表示下至少有一位相等,然后先考虑第 \(i\) 位为 \(1\) 的数全部放一起,为 \(0\) 的放一起。
然后使得两种不同类型的数的中间有交集,这样放下去会导致 \(p_1\) 和 \(p_n\) 没有交,但是交换一下 \(p_1\) 和 \(p_2\) 即可。
最后只需要对于每一种不同 \(p_i\) 输出对应集合的数即可。
注意特判不同质因子个数只有 \(1\) 或者 \(2\) 的情况。
1375D
Tag:构造 1900
考虑把最后序列转化为 \(0,1,2...n\) 的形式,即 \(a_i= i-1\)
做法是:如果当前 \(mex = n\),就把第一个不合法的位置弄成 \(n\) ,否则令 \(a_{mex+1} = mex\)。
这样变化次数小于 \(2n\) 的原因是,这样其实很像置换,我们会发现均摊 \(2\) 次操作就能准确固定一个位置,所以最多 \(2n\) 次。
804C
Tag:构造 2200
首先答案的上界是 \(\max s_i\)。
然后我们以 \(s_k = \max s_i\) 的点为 root,进行 \(dfs\) , 然后对根节点的所有冰淇淋编号染色,接下来遍历整棵树。
每次遇到一个没有染色的冰淇淋,把它染成当前点被染色过的冰淇淋编号的 \(mex\) 即可。
1994E
Tag:树的直径 2400
考虑直径长度如果为奇数 \(d\),那么设直径中点为 \(x\),所以只要 \((x,0)\),\((x,1)\) \(.....\) \((x,\frac{d-1}{2})\) 即可,总的操作次数是 \(\frac{d+1}{2}\) 次,可以证明是答案的下界。
我们再考虑 \(d \equiv 2 \pmod{4}\),其实可以任选一个中点,和上面操作是一样的。
但是当长度是 \(4\) 的倍数时,比如长度为 \(4\) ,我们只要对中间两个点各操作一次就行了,
这启发我们找到直径的中间边 \((x,y)\),然后 \((x,1),(y,1),(x,3),(y,3)....\) 即可,这样最多做 \(\frac{d}{2}\) 次操作。
1929E
Tag:虚树思想 状压dp 2300
如果我们把经过一条边 \(e\) 的所有路径压成一个二进制数 \(a_e\),我们就只需要做一个简单的状态压缩 dp 即可。
但是边的数量是 \(O(n)\) 级别的,看似不能接受,但是如果把这颗树的虚数求出来,数量级就是 \(O(k)\) 级别的了。
也就是说真正本质不同的边至多只有 \(4k\) 左右的量级,那么时间复杂度就是 \(O(k2^k)\) ,可以接受。

浙公网安备 33010602011771号