我 AK 的第二场(?)的 Div.2,还捡了个 rk4(虽然我 div2 only 的最高记录是 rk2)祭之(

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

Codeforces Round #717 (Div.2) 题解的更多相关文章

  1. Codeforces Round #182 (Div. 1)题解【ABCD】

    Codeforces Round #182 (Div. 1)题解 A题:Yaroslav and Sequence1 题意: 给你\(2*n+1\)个元素,你每次可以进行无数种操作,每次操作必须选择其 ...

  2. Codeforces Round #608 (Div. 2) 题解

    目录 Codeforces Round #608 (Div. 2) 题解 前言 A. Suits 题意 做法 程序 B. Blocks 题意 做法 程序 C. Shawarma Tent 题意 做法 ...

  3. Codeforces Round #525 (Div. 2)题解

    Codeforces Round #525 (Div. 2)题解 题解 CF1088A [Ehab and another construction problem] 依据题意枚举即可 # inclu ...

  4. Codeforces Round #528 (Div. 2)题解

    Codeforces Round #528 (Div. 2)题解 A. Right-Left Cipher 很明显这道题按题意逆序解码即可 Code: # include <bits/stdc+ ...

  5. Codeforces Round #466 (Div. 2) 题解940A 940B 940C 940D 940E 940F

    Codeforces Round #466 (Div. 2) 题解 A.Points on the line 题目大意: 给你一个数列,定义数列的权值为最大值减去最小值,问最少删除几个数,使得数列的权 ...

  6. Codeforces Round #677 (Div. 3) 题解

    Codeforces Round #677 (Div. 3) 题解 A. Boring Apartments 题目 题解 简单签到题,直接数,小于这个数的\(+10\). 代码 #include &l ...

  7. Codeforces Round #665 (Div. 2) 题解

    Codeforces Round #665 (Div. 2) 题解 写得有点晚了,估计都官方题解看完切掉了,没人看我的了qaq. 目录 Codeforces Round #665 (Div. 2) 题 ...

  8. Codeforces Round #160 (Div. 1) 题解【ABCD】

    Codeforces Round #160 (Div. 1) A - Maxim and Discounts 题意 给你n个折扣,m个物品,每个折扣都可以使用无限次,每次你使用第i个折扣的时候,你必须 ...

  9. Codeforces Round #383 (Div. 2) 题解【ABCDE】

    Codeforces Round #383 (Div. 2) A. Arpa's hard exam and Mehrdad's naive cheat 题意 求1378^n mod 10 题解 直接 ...

随机推荐

  1. ASP.NET MVC 中使用 jQuery 实现异步搜索功能

    常见的几种异步请求方式: Ajax.BeginForm   异步提交文本的形式 Ajax.ActionLinkk 文本链接的形式 Client Validataion  客户端的认证 一.用jQuer ...

  2. 链式A+B 牛客网 程序员面试金典 C++ Python

    链式A+B 牛客网 程序员面试金典 C++ Python 题目描述 有两个用链表表示的整数,每个结点包含一个数位.这些数位是反向存放的,也就是个位排在链表的首部.编写函数对这两个整数求和,并用链表形式 ...

  3. JAVA笔记4__static关键字/对象数组/foreach/方法的可变参数

    /** * static关键字:修饰属性(实质就是全局变量).方法(无需本类的对象即可调用此方法).类. * 1.static方法只能调用static方法 * 2.static方法只能访问static ...

  4. Python展示文件下载进度条

    前言 大家在用Python写一些小程序的时候,经常都会用到文件下载,对于一些较小的文件,大家可能不太在乎文件的下载进度,因为一会就下载完毕了. 但是当文件较大,比如下载chromedriver的时候, ...

  5. Redis 专栏(使用介绍、源码分析、常见问题...)

    一.介绍相关 说Redis : 介绍Redis特性,使用场景,使用Jedis操作Redis等. 二.源码分析 1. 数据结构 Redis源码分析(sds):Redis自己封装的C语言字符串类型. Re ...

  6. python基本数据类型操作

    str 字符串 #1.进行字符串转换 首字母转换成大写 # name = 'wangjianhui' # v = name.capitalize() # print(v) #2. 字符转换小写 # n ...

  7. PTA 7-3 Windows消息队列 (25分)

    PTA 7-3 Windows消息队列 (25分) 消息队列是Windows系统的基础.对于每个进程,系统维护一个消息队列.如果在进程中有特定事件发生,如点击鼠标.文字改变等,系统将把这个消息加到队列 ...

  8. mongo笔记

    获取stats from pymongo import MongoClient client = MongoClient() db = client.test # print collection s ...

  9. layui表格-template模板的三种用法

    问题情境: layui中将数据库数据通过layui table渲染到前端表格,非常简单,但是如果数据库存储的信息不能被直接展示,项目中该页面有好几个这样的字段,会员类型,支付类型,会员时长还有平台类型 ...

  10. 【JavaScript定时器小案例】常见的几种定时器实现的案例

    [JavaScript定时器小案例]常见的几种定时器实现的案例 博客说明 文章所涉及的资料来自互联网整理和个人总结,意在于个人学习和经验汇总,如有什么地方侵权,请联系本人删除,谢谢! 说明 在日常开发 ...