\[\mathbb{Defining~\LaTeX~macros\dots}
\newcommand{\dom}[0]{\operatorname{dom}}
\]

0.「集训队互测 2018」Fim4

  暂时不知道正解, 也不知道兔写了依托啥玩意儿. (

  询问串离线建出 AC 自动机, 我们需要将母串在 AC 自动机上匹配, 最后在 fail 树上求子树和得到答案. 母串长度 \(5\times10^9\) 不算太长, 我们可能可以压位来节约一个常数级别的复杂度卡过.

  取步长 \(w\), 对于 AC 自动机上的每个结点, 处理其 \(2^w\) 种转移到达的结点, 匹配时只在 \(2^w\times k\) 步到达的结点打标记, 这样匹配过程就可以除上一个 \(w\). 此后, 我们需要对 AC 自动机上的结点释放标记, 类似搜索地实现可以做到单个结点 \(\mathcal O(2^w)\) 释放标记. 复杂度 \(\mathcal O(|S|2^w+n|S|/w)\), 主要瓶颈是前一个部分的空间, 这里取 \(w=10\) 可以卡过. 当然兔释放标记的部分写的真的是搜索, 如果把这个东西展开成循环应该会快上不少.

1.「ABC 294Ex」K-Coloring

  题如其名, \(k-\)coloring 板题, 这个问题的一个表现较优秀的写法是采用缩图策略:

  • 若图不连通, 递归求解.
  • 若存在叶子, 答案乘上 \(k-1\), 删掉叶子及其连边, 递归求解.
  • 若存在度数为 \(2\) 的点, 讨论其两侧结点颜色是否相等, 递归求解.
  • 若上述缩图策略无效, 用子集卷积暴力求答案.

  毛估复杂度, 当图无法收缩时, 每个结点的度数 \(\ge3\), 则结点数 \(\le\lceil 2m/3\rceil\). 因此, 暴力部分复杂度 \(\mathcal O(2^{2m/3}m^2)\), 容易看出其余部分不是瓶颈, 这样就得到了一个 \(\mathcal O(1.59^mm^2)\) 的算法. 当然, 通过更精细的分析, 可以得到更紧的界.

  不好写? 一个 sweet 的写法是, 先判连通性, 然后取度数最小的结点, 容斥其邻接边颜色取等情况. 这种方法的递归 "底层" (无法缩图的情况) 复杂度略高 (吗?), 但的确舒服很多.

2.「NOI Simu.」解码

rep (t, 0, cur - 1) {
if (same(i, t, cur, stpn)
&& same(i, (t + 1) % 10, cur, stpn)) {
return true;
}
}

  你说得对, 但 \(t\) 和 \(\textit{cur}\) 是第 \(k\) 位而不是第 \(i\) 位. 你真会写代码.

  第一个想法是二分答案, 那就一条路走到黑吧! 对于二分的答案 \(t\), 我们考虑检查是否存在一个 \(m\neq n\) 使得 \(n,m\) 的前 \(t\) 步对应相同的字符串.

  比较 key 的 observation 是, 设 \(n\) 在 \(t\) 步内产生过字符变换的最高的位为 \(h\), 则 \(n,m\) 的前 \(h\) 位 (第 \(0\) 位至第 \(h-1\) 位) 必然相同. 我们从 \(h\) 往上枚举 \(n,m\) 第一个不同的位以及 \(m\) 的对应取值, 注意取值是越小越好, 这样可以尽量避免产生 "\(m\) 先进位, \(n\) 再进位" 的情况, 减少对字符表的要求. 如果构造过程中已经使得 \(m<n\) 那就一定有解了 — 取 \(m\) 的高位和 \(n\) 相同即可. 贪心判定, 最终复杂度是 \(\mathcal O(b^2\ell^2\log n)\), 其中 \(b=10\).

3.「NOI Simu.」图

  差不多会了, 写出来的是:

if (sum[rt] != 2 && sum[rt] != clr[rt]) {
rep (u, 1, n) if (u != rt && clr[u] == clr[rt]) {
clr[u] = 2; // Stimulate an adaptation (always exits).
for (int v = u; v != rt; v = fa[v]) {
sum[v] = 0;
for (auto [w, i]: tre[v]) if (w != fa[v]) sum[v] += ans[i];
sum[v] %= 3, ans[fe[v]] = (clr[v] - sum[v] + 3) % 3;
}
// break;
}
}

注释行没有. 乐.

  先判断掉 \(n=2\) 无解, 因为题目中给了很多限制 (三部图, 连通), 我们可以坚信剩下的情况都有解. 先来考虑二分图的情况. 图上构造的常见思路: 取一个生成树, 我们就在生成树上调节度数. 假设在一种二染色方案中, 点 \(u\) 的颜色是 \(c_u\in\{0,1\}\), 一个自然的想法是构造边权使得 \(u\) 的边权和 \(s_u=c_u\). 在树上, 我们可以轻松地调节好除根以外的结点, 如果此时根 \(r\) 非法, 怎么办呢? 注意我们只用了两种颜色, 接下来就需要引入 \(c=2\) 了. 我们取 \(u\neq r\) 且 \(c_u=c_r\), 令 \(c_u\gets 2\), 对应调整 \(u\to r\) 这条路径, 此后 \(s_r\) 必然被改变, 不管变成什么都是一定合法的!

  好, 放到三部图上, 我们仍然尝试用树构造 \(s_u=c_u\). 与二部图不同的是, 我们需要用树外的边构造答案. 非二分图一定存在奇环, 奇环上的边交替 \(\pm1\) 就可以让特定的点 \(s_u\gets s_u+2\), 我们用某个奇环调整根结点即可.

  两部分复杂度都是 \(\mathcal O(n+m)\).

4.「NOI Simu.」表达式

  这个… 有点怪啊, 猜猜出题人的 motivation 好了.

  首先, 这个问题不弱于 2-SAT, 且 SAT 结构整出来的 DAG 可以等价地描述变量关系, 我们不妨就在图上思考. 所有量词都是 \(\exist\) 时, 可以导出原命题为真的必要条件:

  • \(\forall i\), \(x_i\) 和 \(\bar x_i\) 不再同一个 SCC 中.

  需要研究的是全称量词, 我们可以枚举一下两个量词之间的位置关系:

  • \((\exist x_i)(\exist x_j)\), 就是上面的东西.
  • \((\forall x_i)(\forall x_j)\), 如果 \(x_i\Rightarrow x_j\), \(x_i\Rightarrow\bar x_j\), \(\bar x_i\Rightarrow x_j\), \(\bar x_i\Rightarrow\bar x_j\) 任意一者的原命题或逆命题为真, 则原命题为假. 特别地, \(i=j\) 时, 仍然有同样的约束.
  • \((\exist x_i)(\forall x_j)\), 如果 \(x_i\Leftrightarrow x_j\), … 任意一者为真, 则原命题为假. 虽然初始的说法不长这样, 但经过一些化简可以得到这个结果.
  • \((\forall x_i)(\exist x_j)\), 没有额外限制, \(x_i\) 已经在 \((\forall x_i)\) 约束过, \(x_i\) 确定之后, \(x_j\) 一定存在.

  最后, 我们惊讶地发现这些限制都很好判断, 甚至不需要求 DAG 可达性. \(\mathcal O(n+m)\) 结束.

5.「ULR #1」「UOJ #577」打击复读

6.「UR #7」「UOJ #84」水题走四方

  不管是暴力 DP 还是研究结论, 我们必然要先来约束这个超高自由度的移动操作. 可以发现, 我们可以构造方案使得其中一个人从来没有传送向另一个人, 我们把没有传送过的人叫做本体, 另一个人叫做喻体分身, 那么, 整个操作过程就是: 本体在一条树链上行走, 分身去处理所有的分支子树.

  进一步的, 本体和分身的一些行动可以并行: 当分身只需要处理一条链时, 本体就不需要站在原地传送分身, 而可以继续向下走. 当然, 取子树中最长的树链一定最优, 这给本体预留了最多的行动时间. 麻烦的是, "子树最长链" 需要排除本体走的链, 我们根本不知道这条链是什么呀!

  贪心不了了, 我们尝试 DP. 如果知道本体在并行行走结束时站的位置, 我们就能求出分身处理的子树, 继而得到答案. 因此, 设 \(f(u)\) 表示处理好了 \(u\) 子树外的所有点, 现在本体和分身都站在 \(u\) 上时, 处理剩余部分的最短时间. 我们枚举第一次并行结束时本体走到的结点 \(v\), 则 \(\operatorname{sub}(u)\setminus\operatorname{sub}(v)\) 中需要存在一个深度不小于 \(v\) 的点 (这样才能并行), 有转移

\[f(v)\overset{\min}{\gets}f(u)+s_u-s_v-(c_u-c_v)d_u,
\]

其中 \(s_u\) 表示 \(u\) 子树内叶子深度和, \(c_u\) 表示 \(u\) 子树内叶子个数, \(d_u\) 表示 \(u\) 的深度. 当然, 当 \(v\) 是 \(u\) 的唯一儿子时, 有非并行的转移:

\[f(v)\overset{\min}{\gets}f(u)+1.
\]

那么 \(\min_{u\in\text{leaf}}\{f(u)\}\) 就是答案.

  DP 优化倒是好说 — 并行转移中, \(v\) 肯定只需要被最近的可转移的 \(u\) 更新. 我们只需要对每个点 \(u\) 求出这个祖先 \(a_u\) 即可. 仍然是按子树处理, 递归完子树后剩下未被求解的 \(a_u\) 组成链表, 合并时交叉更新就行. 复杂度 \(\mathcal O(n)\), 尽量不要引入递归.

7.「UR #8」「UOJ #118」赴京赶考

  横纵坐标独立, 距离是区间内连续段数量. 注意是在环而非链上行走. \(\mathcal O(n+q)\).

8.「UR #8」「UOJ #119」决战圆锥曲线

  圆锥曲线是断然不会算的, 我们不如找一点简单的支配对来剪枝, 例如, 若 \((i,y_i)\) 和 \((j,y_j)\) 满足 \(i<j\) 且 \(y_i\le y_j\), 则 \((i,y_i)\) 断然不可能参与答案贡献.

  等等, 序列随机, 这个后缀最大值的数量是 \(\mathcal O(\log n)\) 的! 我们直接线段树维护区间最值, 然后树上遍历出所有后缀最大值更新答案即可. 复杂度 \(\mathcal O(n+m_1\log n+m_2\log^2n)\), 题目中有 \(m_2\le10^5\).

9.「SDOI 2013」「洛谷 P3303」淘金

  最暴力的暴力就是最正解的正解, 不愧是你.

  显然横纵坐标独立, 设 \(g(i)=|\{j\in[1,n]\mid f(j)=i\}|\), 我们如果求出所有的 \(g\), 剩下的工作就是求 \(g(i)\times g(j)\) 的前 \(k\) 大, 这个倒好说, 拿堆随便算算就行.

  怎么求 \(g\) 呢? 注意到 \(g(x)\neq 0\) 的 \(x\) 必然有 \(x=2^a\cdot3^b\cdot5^c\cdot7^d\), 毛估不过 \(10^5\), 跑出来差不多 \(10^4\), 直接用 std::map 记忆化所有状态跑数位 DP 就行. 设状态数为 \(S\), 复杂度为 \(\mathcal O(bS\log S+k\log k)\), 其中 \(b=10\).

10.「ZJOI 2019」「洛谷 P5327」语言

  • Link & Submission.
  • 「A.树论-虚树」「A.启发式合并/分裂」

  路径交叠特别复杂, 跨子树根或者跨分治中心计数都不太方便, 我们可以考虑另一种计数策略: 对于每个点, 求出其能够开展贸易的点数.

  对于点 \(u\) 答案的求解, 我们只需要保留所有经过点 \(u\) 的路径, 求出所有这些路径端点构成的虚树, 虚树 (对应于原树上) 的大小就是答案. 注意答案本身之和虚树形态有关, 而这样的虚树可以通过树上差分删除/加入单点, 启发式合并点集来维护, 这道题就这样了. 复杂度 \(\mathcal O(m\log^2m)\).

11.「ZJOI 2019」「洛谷 P5328」浙江省选

  注意到 \(m\) 很小, 所以我们的算法大抵是一层一层地大力找到能当第一的一次函数, 把它们删除, 如此迭代. 当然, 求能当第一名的函数并不复杂, 就是求这些函数构成的下凸包, 在计算几何的语境下可以说是半平面交, 不过全部是 \(k,b>0\) 的一次函数, 单调栈扫一扫就行.

  求出凸包后由于各个位置被已经去掉的函数的覆盖次数是不一样的, 我们需要拿已经被剥离的上层函数在当前凸包上二分出覆盖部分, 打差分标记, 最后扫描凸包查看凸包上每个函数的露出部分是否存在一个整点, 该整点只被覆盖了层数 \(-1\) 次, 如果存在这样的整点, 对应的函数就进队 (迫真) 了.

  复杂度 \(\mathcal O(nm\log n)\).

12.「UR #8」「UOJ #120」宿命多项式

  尝试通过枚举系数来满足限制. 不妨来计数整系数降幂多项式 \(f(x)\), 使得 \(f(i)\in[0,c_i)\cap\mathbb N\), 不难发现这和原问题等价. 设

\[f(x)=\sum_{i=0}^na_ix^{\underline i},
\]

那么

\[0\le a_0+ka_1+k^{\underline 2}a_2+\cdots+k^{\underline k}a_k<c_k\quad(\forall k).
\]

设前面的部分为 \(d_k\), 则

\[0\le d_k+k!a_k<c_i.
\]

可见, 我们关心 \(d_k\bmod k!\) 的值. 这里比较 key 的转化是, 我们可以通过预先构造 \(a_k=(n-k)!p_k+q_k\) 来降低信息量. 假设我们枚举了 \(\{q_n\}\), 令 \(M_k=k!(n-k)!\)在这种构造下,

\[0\le d_k+k!((n-k)!p_k+q_k)<c_k\\
\Rightarrow\text{count}(p_k)=\begin{cases}
c_k/M_k, & c_k\bmod M_k\le(c_k+d_k+k!q_k)\bmod M_k\\
c_k/M_k+1, & \text{otherwise}
\end{cases}.
\]

其中

\[d_k\equiv\sum_{i=0}^{k-1}k^{\underline i}((n-i)!p_i+q_i)\equiv\sum_{i=0}^{k-1}k^{\underline i}q_i\pmod{M_k}.
\]

可见, 的确只需要 \(\{q_n\}\) 就能计算方案数了. 直接枚举的复杂度是 \(\mathcal O(1!\cdot 2!\cdot\cdots\cdot n!\cdot n)\).

  你妈的, 怎么还有 \(q\) 次询问啊?

  尝试把 \(n!\) 这层枚举去掉. 好消息是, \(k^{\underline 0}q_0=q_0\), 因此 \(q_0\) 对 \(\cdot\bmod M_k\) 的影响是一个匀速的转圈, 总共只有 \(\mathcal O(2^n)\) 个发生取模的点, 在两个相邻取模点之间的答案贡献恒定, 这样就能做到单次 \(\mathcal O(1!\cdot 2!\cdot\cdots\cdot (n-1)!\cdot2^n)\) 啦! 不过毕竟还得排序, 所以可以若干个序列统一进行 \(n!\) 值域的桶排.


  赞叹一下现代编译器, 编译期求值展开所有预处理过程就不说了, 对小数组的循环迭代貌似会倍增地展开成顺序结构 (比如对 int ary[7] 的迭代, 会生成迭代 \(4,2,1\) 次的汇编, 然后判断跳转). 但不知道为什么, 我的提交的代码在 g++ 10.3 中开启 -O3 选项时会警告:

.../main.cpp:66:38: warning: iteration 7 invokes undefined behavior [-Waggressive-loop-optimizations]
66 | rep (j, 0, k) val[k] += dpwr[k][j] * rem[j];
| ~~~~~~~~~^
.../main.cpp:5:52: note: within this loop
5 | , l, r) for (int i = l, rep##i = r; i <= rep##i; ++i)
| ^ .../main.cpp:66:5: note: in expansion of macro ‘rep’
66 | rep (j, 0, k) val[k] += dpwr[k][j] * rem[j];
| ^~~

而且相同的警告重复了三次 (难道对应了上面的倍增次数? 阅读汇编代码发现这个循环似乎确实被倍增展开了). 不知道为什么会有这个警告, 逻辑上 \(j\) 也不可能 \(=7\) 啊.

13.「NOI Simu.」乐

  乐, 复杂度感知对了也除不下去 \(\omega\).

  经过足够时间的试错之后可以发现这题不太能 \(\text{polylog}\) (实际上, 似乎可以归约矩乘证明), 我们不得不在 \(10^6\) 的震撼规模下考虑根号分治, 继而可以猜到一个类似 \(\mathcal O(n\sqrt{n/\omega})\) 的复杂度 — 我们只需要在某种块长上除掉一个 \(\omega\), 就可以平衡出正解.

  设阈值为 \(B\), 对于询问 \((s,t)\), 若 \(\deg(s)\le B\), 该询问最多在 \(\mathcal O(B)\) 种颜色的连通块中有意义, 我们可以 \(\mathcal O(nB)\) (\(n,m,q\) 同阶, 下同) 地查询它们.

  现在, 我们只需要讨论满足 \(\deg(s),\deg(t)>B\) 的询问. 注意这样的点只有 \(\mathcal O(n/B)\) 个, 我们称它们为关键点. 对每种颜色, 考虑其所有连通块, 若连通块大小不超过 \(B\), 我们还是可以 \(\mathcal O(B^2\cdot n/B)\) 地大力更新答案 (一共只有 \(\mathcal O(n^2/B^2)\) 个答案是我们关心的, 可以直接保存). 否则连通块大小大于 \(B\), 这样的连通块总共只有 \(\mathcal O(n/B)\) 个, 我们给这个连通块一个新的标号, 将其记录在其中的每个关键点上. 最后查询时, 我们需要额外加入这部分贡献, 即两个关键点的标号集合的交集大小, 用 std::bitset 维护即可. 这部分的复杂度是 \(\mathcal O(n^2/(B\omega))\).

  取 \(B=\sqrt{n/\omega}\), 平衡得到 \(\mathcal O(n\sqrt{n/\omega})\), 不过空间是 \(\mathcal O(n\omega)\) 的, 实际实现时阈值不能太小.

14.「NOI Simu.」铲雪

  (这个星星纯粹是对代码量的反抗 w.)

  一眼丁真, 鉴定为道路铺设. 边上权值道路铺设的结论很简单, 我们知道

\[\textit{ans}=\sum_{u=1}^nw_u\max\{2x_u-s_u,s_u\bmod 2\},
\]

其中 \(s_u\) 是 \(u\) 邻接边边权和, \(x_u\) 是其中的最大边权, 这个式子很好理解, 难点在于维护.

  当 \(2x_u\ge s_u\) 时, 我们定义此时 \(x_u\) 的 \(\arg\max\) (之一) 为 \(u\) 的 dominator, 记为 \(\dom(u)\), 若不存在这样的点则 \(\dom(u)=0\). 注意到若一个点 \(u\) 的两条邻接边同时被 \(+d\), \(\dom(u)\) 只可能从非零值变为 \(0\), 若 \(u\) 只有一条邻接边被 \(+d\), \(\dom(u)\) 才可能从 \(0\) 变为非零值. 也就是说, \(\dom(u)\) 的全局变化次数是 \(\mathcal O(n)\) 的. 我们可以树剖剖分, 将 \(\dom(u)\) 非零, 且非父亲, 非重儿子的 \(u\) 拉到线段树上维护贡献和 \(2x_u-s_u\) 的最小值, 用于检测 \(\dom(u)\) 变化; 其他的 \(u\) 大力维护答案就行. 复杂度 \(\mathcal O(n\log n\log m)\).

15.「CF 1310C」Au Pont Rouge

  写一个 \(\mathcal O(n^2\log^2n)\) 甚至 \(\mathcal O(n^2\log n)\) 的玩意儿 (\(n,m\) 同阶), 全程暴力可过.

Solution Set - “一二行诗句相遇,十万颗恒星解体”的更多相关文章

  1. Redis主从是否生效的特殊测试方法

    Redis主从的特殊测试方法 配置主从 Redis的主从设定,相较于MySQL的主从,配置起来非常简单,不必像MySQL数据库一样手动记录bin log的位置再配置,但又可以像MySQL一样,一主带多 ...

  2. Hadoop 实现 TF-IDF 计算

    学习Hadoop 实现TF-IDF 算法,使用的是CDH5.13.1 VM版本,Hadoop用的是2.6.0的jar包,Maven中增加如下即可 <dependency> <grou ...

  3. NOIP 2017 列队 - Splay - 树状数组

    题目传送门 传送点I 传送点II 题目大意 (家喻户晓的题目应该不需要大意) (我之前咋把NOIP 2017打成了NOIP 2018,好绝望) Solution 1 Splay 每行一颗Splay,没 ...

  4. [转帖]DRAM芯片战争,跨越40年的生死搏杀

    DRAM芯片战争,跨越40年的生死搏杀 超级工程一览 ·2017-08-20 12:50·半导体行业观察 阅读:1.4万 来源:内容来自超级工程一览 , 谢谢. DRAM是动态随机存储器的意思,也就是 ...

  5. Micro LED巨量转移技术研究进展

    近年来,Micro LED因其功耗低.响应快.寿命长.光效率高等特点,被视为继LCD.OLED之后的新一代显示面板技术.Micro LED的英文全名是Micro Light Emitting Diod ...

  6. web前端:css

    css简介: web文档的结构由html元素定义,而这些html元素是如何显示的,则是由层叠样式表css来定义,这样就实现了结构与表现的分离. 1.外部样式表 可以将样式定义放在一个单独的文件中,并且 ...

  7. The Rings Akhaten

    在其他的平行宇宙中存在着一个古老的星系--Akhaten,星系中有七个世界,上面生活着Panbabylonian.Lucanian等物种,不过外界也常常把他们统称为Akhet,因为这七个世界环绕着同一 ...

  8. en-zh(科学技术)science and technology

    S Korea to roll out 5G韩国正式推5G商用服务 South Korea will become the first country to commercially launch f ...

  9. TensorFlow相关的一些技巧

    谷歌开发技术推广工程师 Laurence Moroney 在 Google Cloud Next 大会上进行了一段 42 分钟的演讲,主题是「What's New with TensorFlow?」. ...

  10. oi之詩

    §3我看到你所说的那位OIer了. §2OIERNAME? §3是的.小心.他已达到了更高的境界.他能阅读我们的思想. §2没关系.他认为我们是代码的一部分. §3我喜欢这个OIer.他做得很好.他从 ...

随机推荐

  1. nodejs redis 小试牛刀

    一.环境安装 书接上文,浅学Redis之后,服务器已经安装Redis了,用 nodejs 链接 redis 之前,先安装 nodejs 环境. 1.安装fnm (1)压缩包fnm-linux.zip搞 ...

  2. 递推(C语言)

    文章目录 1.斐波那契数列 2.太波那契数列 3.二维递推问题 4.实战 4.1 力扣509 斐波那契数 4.2 力扣70 爬楼梯 4.3 力扣119 杨辉三角|| 递推最通俗的理解就是数列,递推和数 ...

  3. JS转义html编码

    两个方法: 1.利用用浏览器内部转换器实现html转义: 2.用正则表达式实现html转义: var HtmlUtil = { /*1.用浏览器内部转换器实现html编码(转义)*/ htmlEnco ...

  4. [离线计算-Spark|Hive] 大数据应用性能指标采集工具改造落地

    背景 主要介绍针对平台的spark应用程序,在不修改用户程序的情况下 如何采集其资源和性能指标为后续分析使用,如性能优化,资源使用计价等. 分析挑战 在应用程序级别关联大量进程的指标 在分布式环境中, ...

  5. for Qbert sometimes we stay in lives == 0 condtion for a few frames —— baselines中环境包装器EpisodicLifeEnv的分析

    相关: baselines中环境包装器EpisodicLifeEnv的分析 一直不是很理解在reinforcement leanrning算法在atari游戏的observation的交互过程中对li ...

  6. 基于ctfshow的信息收集思路与CTF实战

    本文靶场来源于CTFshow,并不完全按照靶机的顺序排列,而是以测试操作为导向,按博主个人理解排列. 1. 前端源码 在CTF中,先看源代码是个好习惯,出题者经常会在源代码中以注释的形式提供一些提示 ...

  7. 4G模组软件指南 | json数据处理深度学习篇

    针对4G模组软件的json数据处理,我已做出如下示例分享给大家,以4G模组Air780E为例: 1.JSON介绍 JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式 ...

  8. django插件之django-import-export

    文档:https://django-import-export.readthedocs.io/en/latest/getting_started.html#creating-import-export ...

  9. 第十四届蓝桥杯省赛C++B组--接龙序列

    接龙序列 我们称序列中\(a_i\)的首位数字恰好是\(a_{i-1}\)的末尾数字,这样的序列叫做接龙序列,比如12 23 35 57,所有长度为1的整数序列都是接龙序列,现在给定一个长度为\(n\ ...

  10. 移动端PDF阅读器重排版效果对比-小白PDF阅读器与KOReader重排效果对比

    PDF是一种跨操作系统平台的电子文件格式,它能在各种不同的平台上以相同的版式显示.很多扫描书籍或者电子书籍都会采用PDF格式存储.但是移动端由于屏幕的限制,以原版展示PDF会导致画面缩放严重,影响阅读 ...