A

首先肯定位数越多越好,所以先用尽量多的放 $1$。

然后看一下能否用最后一个把最高位上的 $1$ 换成更大的数字(实际上你只能换成 $7$)

B

处理处原串每个前缀的权值 $a_i$。如果 $a_n=0$ 并且存在权值为 $x$ 的前缀就有无数个,否则就是所有形如 $x+ka_n,k \in \mathbb{N}$ 的权值的前缀的个数。

C

如果 $s$ 的字符集不包含 $t$ 的字符集就无解。

否则每次贪心尽量取就好了。对于每个位置预处理 $to_{i,c}$ 表示往后的第一个 $c$ 字符的位置,暴力跳一跳。总共只会跳 $O(n)$ 次。

D

题面具有迷惑性。

先考虑一个结论:任意 $m$ 个连续正整数中与 $m$ 互质的数的个数恰为 $\varphi(m)$

证明:只需要把这 $m$ 个数都 $\bmod m$,由于 $\gcd(a,m) = \gcd(a\bmod m,m)$,所以肯定一一对应 $[0,m-1]$ 的情况。

设 $g=\gcd(a,m)$,有 $\gcd(\frac{a}{g},\frac{m}{g}) = \gcd(\frac{a+x}{g},\frac{m}{g}) = 1$。所以答案是 $\varphi(\frac{m}{g})$。

直接暴力莫反也是可以的。

E

一个暴力是枚举一开始分割的位置 $k_1$,考虑操作后的序列一定是分成两个值域连续的组,设这个分界是 $k_2$,就可以唯一确定代价了。

考虑对于一个 $k_1$,我们实时维护出所有的 $k_2$ 的答案。我们现在考虑 $k_1 \to k_1+1$ 时对答案的影响:相当于将一个元素 $x$ 从后面删除并且加到前面。我们只考虑如何维护删除(加入是倒过来的):

考虑未删除前 $x$ 对哪些 $k_2$ 有影响:只会对 $x \leq k_2$ 的一些方案有影响,因为在这些方案里我们需要移动 $x$。对应了线段树的区间加操作。于是就做完了。

那么加入后会对 $x > k_2$ 有影响:因为我们要花一些代价把它拿到右边去了。

F

经典题。权值过大考虑离散化,为了方便离散化成左开右闭区间,设离散化后排名 $i$ 的真实权值是 $x_i$。

设 $f_{i,j}$ 表示考虑到第 $j$ 个数,当前第 $j$ 个数在区间 $(x_{i-1},x_i]$ 的方案数。转移的时候枚举有多少个数在这个区间,乘上一个组合数即可(相当于是方程的非负整数解个数),复杂度如果在求组合数的上面实现精细就可以做到 $O(n^3)$,但是对于这个题 $O(n^4)$ 足够了。

Last modification:September 14th, 2020 at 09:43 pm
如果觉得我的文章对你有用,请随意赞赏