2022-7-23讲课

CF1687E

题目叙述

『来吧,让我们构筑起一个不会遗弃弱者的乐园吧!』——少名针妙丸&鬼人正邪,《东方辉针城》

针妙丸有一个万宝槌,可以将物体变大或者变小。她现在在对一个序列 \(a\) 测试这一功能。具体而言,她有一个实数 \(v=1\),她希望在不超过 \(10^5\) 次操作后,将 \(v\) 变为 \(\gcd \limits_{i \neq j} \{a_i \times a_j\}\)。其中,\(\gcd \limits_{i \neq j} \{a_i \times a_j\}\) 指的是,序列 \(a\) 中两个不同元素相乘得到的所有乘积的最大公约数。

在每一次操作中,针妙丸可以选择序列 \(a\) 中的一个子序列 \(b\),并且对其做如下两种操作中的一个:

  • 放大:令 \(v \leftarrow v \times \operatorname{lcm(b)}\)
  • 缩小:令 \(v \leftarrow \dfrac{v}{\operatorname{lcm(b)}}\)

其中,\(\operatorname{lcm(b)}\) 指的是序列 \(b\) 中所有元素的最小公倍数。此外,她不要求 \(v\) 一定是个整数,也就是说执行缩小操作的时候,\(v\) 可以不是 \(\operatorname{lcm(b)}\) 的倍数。

更进一步地说,针妙丸希望她选取的所有子序列 \(b\) 的长度不超过 \(10^6\),即 \(\sum |b| \leq 10^6\)。请你为她找到一种操作方案。注意,您无需最小化任何东西。

题解

首先考虑 \(\gcd_{i\not=j}\{ a_i\times a_j\}\) 是什么。对于每个质因子分析,相当于若干个数两两加和(两个数不能是同一个),最小是多少。容易发现一定是最小值加次小值。
而最小值加次小值这两个都可以通过 min-max 容斥,而最小公倍数就相当于取最大值。
这样做需要的操作次数是 \(2^nn\) 的,比较大。考虑将 \(n\) 减小。
考虑将原问题的集合缩小,每个质因子其实只需要最小次幂和次小次幂。而次幂如果不是两个均为 0 的话,那么至少 \(n-1\) 个数有这个质因子,容易发现这样的质因子数量不超过 7 个。
因此选出来的数量最多14个。有人说需要加上一个数用来限制除去这个数以外别的质因子次幂不为 0 的情况,我说不需要。
但实际上这其实还是只需要至多 14 个数,因为如果要到15个,那么首先一定有 7 个质因子需要这样的事情,就必须是 2357111317 这些质因子,而每个质因子之多一个数不是他的倍数,因此,包含质因子数量最多的数至少包含其中的 6 个质因子,但是除此之外还需要包含一个除去这些质因子以外的一个质因子(否则不需要添加一个数除掉),也就是说还是要包含 7 个质因子,但是又不是前 7 个,那肯定超过 10^6 了,不可能。
这就做完了。

总结

  • 考虑 \(\gcd\) 相关的问题,可以分质因子考虑,然后 min-max 容斥。
  • 值域不大的情况下,从质因子不能很多的角度考虑问题,考虑缩减数的数量之类的。

CF1408I

题目叙述

长度为 \(n\) 的序列,\(k\) 次操作,每次随机一个数给他减少 1 。对于 \(x=0\sim 2^c-1\) ,求最终序列的异或和为 \(x\) 的概率是多少。

题解

发现 \(k\) 很小而 \(a_i\) 并不算很小。可以发现 \(a_i\oplus (a_i-b)\) (其中 \(b\le k\))并不大。
这就相当于花费 \(b\) 的代价让异或和异或上 \(a_i-b\) ,而 \(a_i-b\) 只和最后 4 位以及除去最后 4 位的那个数的 lowbit 相关。
考虑将问题表达为生成函数的形式,如果在 \(x\) 维度上做异或卷积,在 \(y\) 维度上做加法卷积,另外还要套上一个 EGF,那么问题形式就变为求

\[\prod_{i=1}^nG_{i,j}(x,y)^{r_i} \]

其中 \(G_{i,j}(x,y)\) 表示花费 \(i\) 的代价,让异或和变化 \(j\) 的数的EGF,也就是 \(\frac{x^jy^i}{i!}\) 。剩下的任务就是把这个多项式计算出来。
考虑先在 \(x\) 维度上进行 FWT,然后下面的工作是将一些多项式乘起来,再 FWT 回去。乘起来怎么办,考虑 ln 再 exp。
但是这时候发现复杂度有点高,一共有256个多项式,每次ln的复杂度是平方,每个多项式有 \(2^16\) 个东西需要 ln,因此复杂度是 \(2^16*16^4\) 的,明显过不了。
而我们发现这个需要 ln 的东西一共只有那么多种,因为只有 2^16 种位置可能取值,每个位置只能是 \(\pm \frac{y^k}{k!}\) 两种情况。因此只要与处理好这些东西的 ln 就可以了。
我们需要 exp 的东西只有 \(2^16\times 16\) 个,不需要优化复杂度(也没法预处理)。

总结

  • 如果一个生成函数的两个维度都需要处理的话,不妨先处理一个维度(这题来看应该先处理异或,最后变成多项式乘法的问题)
  • 看看变化量是不是比较小。
  • 要做多项式乘法的话可以先 \(\ln\)\(\exp\)

CF1707E

题目叙述

一个序列 \(\{a_i\}\) 满足 \(1\le a_i\le n\) ,定义函数 \(f(l,r)\),其返回值为一个区间,具体来说是序列 \(a\) 的区间 \([l,r]\) 中最小值到最大值构成的区间。定义 \(f^k(l,r)\) 表示将 \(f(l,r)\) 迭代 \(k\) 次。\(q\) 个询问,每次询问最小的 \(k\) 满足 \(f^k(l,r)=(1,n)\)

题解

对于两个区间 \([l1,r1]\)\([l2,r2]\) ,如果有交,那么必然满足 \(f(l_1,r_1)\cup f(l_2,r_2)=f([l_1,r_1]\cup [l_2,r_2])\)
更进一步,我们有 \(f^k([l_1,r_1]\cup [l_1,r_1])=f^k([l_1,r_1])\cup f^k([l_2,r_2])\)
考虑直接倍增判断,可倍增是因为如果能得到 \([1,n]\) 这个区间,那么再来几次还是 \([1,n]\)
\(f^k([l,r])=f^k([l,l+1])\cup f^k([l+1,l+2])\cup\cdots\cup f^k([r-1,r])\)
因此直接使用 st 表的思想预处理每个位置向后 \(2^j\) 个,进行 \(2^k\) 次迭代得到的区间是什么就可以了。

总结

  • 可能有些关于区间的函数要思考是否满足 \(f(l_1,r_1)\cup f(l_2,r_2)=f([l_1,r_1]\cup [l_2,r_2])\) 这样的特性?
posted @ 2022-07-23 22:56  YouthRhythm  阅读(54)  评论(0)    收藏  举报