Codeforces Round #717 (Div.2) 题解
A
这题我竟然 WA 了两发,丢人(
直接贪心,对于 \(i=1,2,\cdots,n-1\),每次拿 \(i\) 和 \(n\) 执行操作,直到 \(a_i=0\) 或用完所有操作次数为止
B
这题我竟然 WA 了一发,丢人(
题目等价于是否可以将原数组划分为 \(\ge 2\) 段满足每段异或和相同。
首先如果所有数异或和都是 \(0\),由于 \(n\ge 2\),那么随便找一个断点 \(i\in[1,n-1]\) 并将 \([1,i]\) 异或在一起,\([i+1,n]\) 异或在一起一定可以得到两个相等的数。
否则显然不可能将原数组划分成偶数段,并且每一段的异或和都是 \(S=\operatorname{xor}\limits_{i=1}^na_i\),这个直接贪心好了,就不断向右扫描,如果扫到一个前缀异或和 \(S\) 就多划分一段,然后看划分出来的段数是否 \(\ge 2\)
时间复杂度 \(\mathcal O(n)\)
C
首先我们检查是否原来的数组就是好的,这个显然可以背包检验,如果是那么直接输出 \(0\) 好了。
否则可以证明一步操作就能将原数组变为好的数组,具体构造就是找出最大的 \(k\) 满足 \(\forall i,2^k\mid a_i\) 然后令所有 \(a_i\leftarrow\dfrac{a_i}{2^k}\),然后找到满足 \(a_i\) 是奇数的下标 \(i\) 并将 \(a_i\) 删除即可,至于正确性,显然除以 \(2^k\) 是不影响数组究竟是不是好的,而由于原数组不是好的,必然有 \(\sum a_i\) 为偶数,故删去某个 \(a_i\) 是奇数的 \(a_i\) 后必然有 \(\sum a_i\) 为奇数,也就变成好的数组了,又由于 \(k\) 为最大的满足 \(\forall i,2^k\mid a_i\) 的数,这样的 \(i\) 一定存在,得证。
D
首先一个显然的性质是 \(\text{lcm}(a_1,a_2,\cdots,a_n)=a_1a_2\cdots a_n\leftarrow\forall i\ne j,\gcd(a_i,a_j)=1\),故考虑将每个数分解质因数,然后对于每个 \(l\) 找出最大的 \(r\) 满足 \([l,r-1]\) 符合条件——这个显然可以 two pointers 求出,时间复杂度 \(n\omega(a_i)\)。然后倍增一下即可。
E
这个题还算有点意思,i 了 i 了((
首先考虑对于一个排列 \(p\),最少需要多少操作才能从 \(1,2,\cdots,n\) 变成 \(p\)——显然对于一个最少操作次数为 \(x\) 的排列 \(p\),其会对 \(ans_x,ans_{x+2},ans_{x+4},\cdots,ans_{x+2t},t\in\mathbb{Z}\) 产生 \(1\) 的贡献,因为对于某个固定的 \(i,j\) 交换两次之后就会复位。而这个最小操作次数显然可以从置换的角度理解,我们将 \(p\) 拆成一个个置换环,对于一个置换环 \(x_1,x_2,\cdots,x_m\) 我们显然可以依次交换 \((x_{m-1},x_m),(x_{m-2},x_{m-1}),\cdots,(x_2,x_1)\),这样 \(m-1\) 次操作即可复位,操作次数为 \(m-1\),因此总操作次数就是 \(\sum(\text{置换环大小}-1)\)
接下来考虑怎样计算答案,考虑 \(dp\),我们记 \(dp_{i,j,k}\) 表示考虑了大小在 \([2,i]\) 中的置换环,所有置换环大小 \(-1\) 之和为 \(j\),所有置换环大小之和为 \(k\) 的方案数,转移就枚举选择了 \(c\) 大小为 \(i+1\) 的置换环,那么 \(dp_{i+1,j+ci,k+c(i+1)}\leftarrow dp_{i,j,k}\times M\),其中 \(M\) 为将 \(c\) 个大小为 \(i+1\) 的置换环塞进去的方案数,具体来说 \(M=\dbinom{n-k}{i+1}\times\dbinom{n-k-(i+1)}{i+1}\times\cdots\times\dbinom{n-k-(i+1)\times(c-1)}{i+1}\times\dfrac{1}{c!}\times(i!)^c\),前面那一坨二项式系数就是从剩余 \(n-k\) 个位置中选出 \(c(i+1)\) 个位置给这 \(c\) 个置换的方案数,\(\dfrac{1}{c!}\) 表示这 \(c\) 个置换本质上是相同的,故除以 \(c!\),后面又乘个 \((i!)^c\) 是因为长度为 \(i+1\) 的圆排列有 \(i!\) 个。这样枚举 \(i,j,k\) 再枚举 \(c\) 复杂度看似是 \(k^4\),不过不难发现 \(c\) 最多枚举到 \(\dfrac{k}{i}\),因此复杂度实际上是 \(k^3\ln k\),可以通过此题。
还有一点就是在计算 \(M\) 的过程中,我们要计算很多形如 \(\dbinom{x}{y}\) 的二项式系数的值,这里的 \(x\) 很大,因此无法预处理阶乘和阶乘逆元求出,不过注意到 \(y\) 可能的值很小,\(n-x\) 的值也很小,因此可以预处理出 \(c_{x,y}\) 表示 \(\dbinom{n-x}{y}\) 这样就不用转移的时候再 \(\mathcal O(k)\) 地计算二项式系数的值了。
据说这题 \(k\) 可以扩大到 \(2000\)?orzorz,果然还是 wtcl 了啊/kk
 
                    
                
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号