大难题,但是非常的有意思。思路来自 \(\color{black}\text{艾}\color{red}\text{利克斯·伟}\)。补充了一点小细节。

题意

对于一个 可重 集合 \(S\),初始为 \(\{1 \dots n\}\),执行以下操作:删除集合中的最大、最小元素 \(S_{min}, S_{max}\),加入 \(S_{max} - S_{min}\)。最终集合只剩下一个元素,输出这个元素。

给定 \(T\) 组 \(n\),分别输出答案,\(1 \le T \le 10^5, 1 \le n \le 10^9\)。

做法

首先观察题目给出的操作序列,容易发现这些操作是分为两部分的。记第 \(i\) 次操作加入的是 \(a_i - b_i\)。存在一个 \(p\) 使得 \(\forall 1 \le i < p\),\(a_i > 2b_i\),并且 \(a_p \le 2b_p\)。那么 \(\forall 1 \le i \le p, b_i = i, a_{i-1} - a_i \in \{0, 1\}\),看起来是很可以做的。

这部分先按下不表,转而考察 \(p < i \le n-1\) 的情况。记第 \(p\) 次操作以后的可重集合是 \(S'\),同时也记它为集合排序后的序列。那么容易得出此时的每次操作以后,新集合的最小值一定是刚加入的数。这个直觉的来源是,加入的数整体而言在不断变小。事实上可以证明,由于最大值不减,所以每两轮,加入的数一定不减;而第 \(p\) 和 \(p+1\) 次操作都保证生成的数是集合最小值——所以接下来的过程中它始终保持最小。有了这个结论,我们可以优美地描述后半部分操作:\(Ans = S'_2 - (S'_3 - (S'_4 - \dots (S'_{n-p} - S'_1)\dots))\)。

接下来,考虑前半部分操作。首先,\(b_i = i, a_{i-1} - a_i \in \{0, 1\}\) 告诉我们,每一次生成的数都会变小 \(1\) 或 \(2\)。那么从大到小扫描值域的过程中,每次碰到的数都要么有一个要么有两个。一旦生成了一个数,这个数和它后面的所有数的个数都确定下来了。所以考虑依次确定这些数的个数。记 \(d_i = a_{i-1}-a_i\),则若 \(d_i = 0\),被确定的数是 \(a_i - i\) 有两个;否则被确定的是 \(a_i - i\) 有两个,\(a_i - i + 1\) 有一个。考虑维护 \(d\) 而不是 \(a\)。那么相当于我扫描到一个 \(0\) 就加入 \(10\),扫描到一个 \(1\) 就加入 \(110\)。考虑 \(d\) 序列的前几项:

\[0/10/11010/1101101011010/...
\]

你可以把生成 \(d\) 的过程分段化,设 \(Q_i\) 表示第 \(i\) 阶段生成的串,那么它前缀依次拼接得到的就是 \(d\) 序列。\(Q_{i+1}\) 是由 \(Q_i\) 中所有 \(0\) 替换成 \(10\),所有 \(1\) 替换成 \(110\) 得到的。生成这种东西,不要依次递推,而是考虑从开头插入操作。具体地,记 \(f_{0/1, i}\) 表示一开始为 \(0/1\) 进行 \(i\) 次迭代得到的东西,那么 \(Q_i = f_{0, i}\)。则存在递推:

\[\begin{cases}
f_{0, i} = f_{1, i-1} + f_{0, i-1}\\
f_{1, i} = f_{1, i-1} + f_{1, i-1} + f_{0, i-1}
\end{cases}
\]

那么我们就获得了一种优雅的方法生成 \(Q\),可以借此获得 \(d\) 的前缀信息。

接下来,只需要结合上面对于后半部分操作的结论即可。容易得出,考虑我们在第 \(p\) 次操作结束后生成的 \(d\) 所对应的 \(a\) 序列。则上述的 \(S'_1 = a_p - p \le p\),而 \(S'_i = a_{n-i+1}(2 \le i \le n-p)\)。所以:

\[\begin{align*}
Ans &= a_{n-1} - (a_{n-2} - (a_{n-3} - \dots (a_{p+1} - (a_p - p))\dots))\\
&= (-1)^{n-p}p +\sum\limits_{i = p}^{n-1} (-1)^{n-i+1}a_i\\
&= \begin{cases}
p-s_{n-1}-s_{n−3}-\dots-sp+1p−sn−1​−sn−3​−\dots−sp+1​。
\end{cases}
\end{align*}
\]

CF1810H Last Number的更多相关文章

  1. JavaScript Math和Number对象

    目录 1. Math 对象:数学对象,提供对数据的数学计算.如:获取绝对值.向上取整等.无构造函数,无法被初始化,只提供静态属性和方法. 2. Number 对象 :Js中提供数字的对象.包含整数.浮 ...

  2. Harmonic Number(调和级数+欧拉常数)

    题意:求f(n)=1/1+1/2+1/3+1/4-1/n   (1 ≤ n ≤ 108).,精确到10-8    (原题在文末) 知识点:      调和级数(即f(n))至今没有一个完全正确的公式, ...

  3. Java 特定规则排序-LeetCode 179 Largest Number

    Given a list of non negative integers, arrange them such that they form the largest number. For exam ...

  4. Eclipse "Unable to install breakpoint due to missing line number attributes..."

    Eclipse 无法找到 该 断点,原因是编译时,字节码改变了,导致eclipse无法读取对应的行了 1.ANT编译的class Eclipse不认,因为eclipse也会编译class.怎么让它们统 ...

  5. 移除HTML5 input在type="number"时的上下小箭头

    /*移除HTML5 input在type="number"时的上下小箭头*/ input::-webkit-outer-spin-button, input::-webkit-in ...

  6. iOS---The maximum number of apps for free development profiles has been reached.

    真机调试免费App ID出现的问题The maximum number of apps for free development profiles has been reached.免费应用程序调试最 ...

  7. 有理数的稠密性(The rational points are dense on the number axis.)

    每一个实数都能用有理数去逼近到任意精确的程度,这就是有理数的稠密性.The rational points are dense on the number axis.

  8. [LeetCode] Minimum Number of Arrows to Burst Balloons 最少数量的箭引爆气球

    There are a number of spherical balloons spread in two-dimensional space. For each balloon, provided ...

  9. [LeetCode] Number of Boomerangs 回旋镖的数量

    Given n points in the plane that are all pairwise distinct, a "boomerang" is a tuple of po ...

  10. [LeetCode] Number of Segments in a String 字符串中的分段数量

    Count the number of segments in a string, where a segment is defined to be a contiguous sequence of ...

随机推荐

  1. Solon2 之 Groovy 语言开发后端接口项目

    今天再做个新的尝试,用 Solon 框架写个 Groovy 后端项目.借助 "Solon Initializr" 生成个项目模板,会比较方便. 1.生成项目模板 打开"S ...

  2. 开源.NetCore通用工具库Xmtool使用连载 - 加密解密篇

    [Github源码] <上一篇>详细介绍了Xmtool工具库中的正则表达式类库,今天我们继续为大家介绍其中的加密解密类库. 在开发过程中我们经常会遇到需要对数据进行加密和解密的需求,例如密 ...

  3. [INS-40996] Installer has detected that the Oracle home (/home/grid) is not empty in the following nodes: [rac2] --求助帖?

    问题描述:12c安装grid的时候,一直再报一个[INS-40996] Installer has detected that the Oracle home (/home/grid) is not ...

  4. 机器学习(六):回归分析——鸢尾花多变量回归、逻辑回归三分类只用numpy,sigmoid、实现RANSAC 线性拟合

    [实验1 回归分析] 一. 预备知识 使用梯度下降法求解多变量回归问题 数据集 Iris 鸢尾花数据集是一个经典数据集,在统计学习和机器学习领域都经常被用作示例.数据集内包含 3 类共 150 条记录 ...

  5. $.set() 处理非响应式案例

    <template> <div id="app"> <ul> <li v-for="item in list" :ke ...

  6. Arch Linux安装笔记

    ​ 最近有些厌倦Windows,所以想尝试一下Linux,选择Arch的原因不再赘述,建议以ArchLinux官方安装指南为主,这篇笔记只是方便我自己安装而写的,仅供参考. 1. 安装前的准备 1.1 ...

  7. js复制功能(pc复制,移动端复制到手机剪切板)

    一个函数,直接调就好了,已测pc和app都适用 1 // 一键复制 2 copyBtn(data) { 3 const input = document.createElement("inp ...

  8. 我的第一个项目(十二) :分数和生命值的更新(后端增删查改的"改")

    好家伙,写后端,这多是一件美逝. 关于这个项目的代码前面的博客有写  我的第一个独立项目 - 随笔分类 - 养肥胖虎 - 博客园 (cnblogs.com) 现在,我们登陆进去了,我开始和敌人战斗,诶 ...

  9. 【图解算法使用C++】1.2 生活中的算法

    图解算法使用C++ 一.计算思维与程序设计 1.2 生活中到处都是算法 计算最大公约数(辗转相除法) // C++ #include<iostream> #include<stdio ...

  10. 基于pyinstaller的python打包工具

    以下是软件链接:https://mysecreat.lanzoub.com/iZPGf0swgtbc 软件功能:可以对py文件进行打包,功能基于pyinstaller模块,因此需要安装python环境 ...