AGC057
A
可以注意到用位数少的一定不优,因为其向外拓展的方式更多导致不能用的数也越多。所以我们肯定先选择位数最多的,然后考虑剩下的还有哪些可以选。假设 \(r\) 的位数为 \(k\),考虑 \([\max(10^{k-1},l),r]\) 都可以选。现在我们要处理位数更少的情况。考虑 \(r\) 的最高位,如果大于 1 那么说明长度为 \(k-1\) 的所有串已经全部被包含就不管了,否则就需要管。考虑 \(r\) 对长度为 \(k-1\) 的串的限制一定是一段前缀,于是找到右端点即可。
B
对于一些神秘题我们考虑先从简单情况入手。我们考虑两个数 \(x,y\) 怎么做。如果 \(x<<y\) 那么我们一定是先让 \(x\) 变大;如果 \(x<y<2x\) 那么考虑令 \(d=y-x\),如果 \(d<k\) 那么通过一定的操作我们能够让两者相同,否则每次的差距只会越来越大,所以不操作最优。我们考虑将 \(x\) 扩展能够得到 \([2x,2x+k]\),每次都是一段区间。如果区间能够包含 \(y\) 那么就没有贡献,否则我们肯定是找到 \(y\) 前面区间的右端点和后面区间的左端点进行选择最优。
对于多个数的情况考虑一个特殊的数,也就是序列最大值,假设叫 \(t\)。如果我们最后得到的序列 \(x\) 被操作了 \(q\) 次,那么其他数起码都要操作 \(q\) 次。证明考虑如果再条一步一定会离 \(t'\) 更近。所以我们可以让 \(t\) 固定,去考虑剩下的数。因为 \(t\) 固定了,所以我们肯定是让其他数尽量靠近它才更优。于是就变成了若干上面两个数的问题,只不过现在对于一个数我们有两种选择,要么选前面区间的右端点 \(lp_i\),要么选后面区间的左端点 \(rp_i\),最后要让选出的数极差最小。这个问题我们可以按 \(lp_i\) 排序,然后我们去考虑答案区间左端点的位置。假设是 \(lp_i\),那么对于 \(i+1\) 到 \(n-1\) 的数我们选 \(lp\) 一定不劣,剩下的一定会选 \(rp\),于是我们维护一个前缀 \(rp\) 最大值即可。
C
先考虑判无解,设 \(m=2^{n-1}\),则一个排列能还原的一个必要条件是 \(p_i\equiv p_{i+m}\pmod{m}\)。证明考虑最终状态下一定是满足条件的,然后就是因为只有异或和 +1 操作,所以这个条件始终成立。
先考虑简单的情况,如果 \(\forall i\in[0,m),p_i\) 的最高位都是 0,那我们直接异或一个 \(p_0\) 就做完了。那如果不为零,我们就想去把它们全都变成零。从左到右考虑 \([0,m)\) 的每个位置,考虑怎么操作才没有后效性?若当前考虑到了 \(i\),前面 \([0,i)\) 的最高位都变成了零,当前是 1,我们考虑用一些 +1 和异或把 1 变成 0 并且不影响其他位置的最高位。首先如果一直 +1 显然不行,所以我们最开始考虑异或。但是如果我们最高位异或上 1 那不就废了吗?这里我们可以先把 \(p_i\) 异或成 \(2^n-1\),这样我们最高位异或上了一个零不会对其他地方有影响,然后我们全局 +1。这时候 \(p_i\) 会变成 0,考虑其他位置若是要最高位变成 1 那一定会产生进位。如果一个 \(p_j\) 要进位那么有 \(p_j=m-1\),但是考虑我们的 \(p_i=2^n-1\),那么就有 \(p_{i+m}=m-1\),于是这样操作永远不会进位。并且这样操作次数不超过 \(2^n+1\),非常优秀。
具体维护可以使用 01trie,时间复杂度 \(\mathcal O(n2^n)\)。
D
首先我们要找到合法数列的上界,其次考虑如何做使得字典序最小。考虑若干形如 \((i,S-i)\) 的数对,显然这里面最多只能选择一个,如果两个都选那么就能凑出 \(S\) 了,所以答案的上界为 \(\left\lfloor S-1\over2\right\rfloor\)。现在我们考虑简化问题,我们其实可以通过确定一个合法的集合 \(B\) 满足 \(\forall x\in A,x\le\left\lfloor S-1\over2\right\rfloor\),据此确定 \(A\)。考虑对于之前的数对 \((x,y),x<y\),若 \(x\notin B\),那么有 \(y\in A\),否则有 \(x\in B\subseteq A\)。现在我们尝试去寻找字典序最小的 \(B\),显然若 \(B\) 满足字典序最小则有 \(A\) 同样满足字典序最小。
在开始前我们先来证明一个引理。
引理:若 \(a,b\in B,a+b\le\left\lfloor S-1\over2\right\rfloor\),则 \(a+b\in B\)。
证明考虑反证法。如果 \(a+b\notin B\),那那么有 \(S-a-b\in A\),于是 \(A\) 中的元素就能够凑出 \(S\) 了。矛盾。
首先我们要明确一点,就是我们从小到大去考虑 \(i\le\left\lfloor S-1\over2\right\rfloor\),如果 \(i\) 能被选择那么我一定会去选它。这里会有一个问题,就是说为啥这样构造出来的 \(B\) 对应的 \(A\) 一定合法呢?考虑反证法,首先 \(B\) 一定合法,若 \(A\) 不合法,那么一定存在一个 \(x>\left\lfloor S-1\over2\right\rfloor\) 能与若干 \(y\in B\) 凑出 \(S\)。因为对于形如 \((i,S-i)\) 的数对只能选择一个数,所以 \(S-x\notin B\)。但是因为有若干 \(y\in B\) 能够凑出 \(S-x\),根据引理有 \(S-x\in B\),所以矛盾。这样就说明了做法的正确性。
接下来我们考虑会加入什么数以及加入的数有什么性质。假设现在 \(x\) 能加入 \(B\),那么对于 \(\forall y=kx,y\le\left\lfloor S-1\over2\right\rfloor\) 一定也能加入 \(B\)。如果原来集合里有 \(x\),我们加入 \(y\),那么对于 \(\forall v=k1x+k2y,v\le\left\lfloor S-1\over2\right\rfloor\) 一定也能加入 \(B\)。这显然可以考虑同余最短路。
考虑最短路之前我们需要找到最小的 \(x\in B\),考虑找到最小的 \(x\not\mid S\)。因为 \(\text{lcm}(1,2,\dots,x-1)\mid S\),所以能算出 \(x\le43\),设为 \(p\)。然后就正常同余最短路做即可。
具体的,我们设 \(f_i\) 表示 \(B\) 中元素能组合出最小的 \(x\bmod p=i\) 的数,加入一个 \(x\) 就有 \(f_{i}\leftarrow f_{(i-kx)\bmod S}+kx\),你写成转两圈的形式会好写一些。一个元素加入后合法当且仅当 \(f_{S\bmod p}>S\),结合 dp 转移式有 \(\forall i,x>\left\lfloor S-f_{(S-ix)\bmod p}\over i\right\rfloor\)。到此这个题差不多就做完了,求答案考虑二分,若要求 \(B\) 中 \(\le k\) 的元素个数,则有 \(\sum\limits_{i=0}^{p-1}\left\lfloor k-f_i\over p\right\rfloor+[i>0]\)。时间复杂度 \(\mathcal O(p^3+p\log n)\)。
E
困难题,花费大量时间才会。
注意到值域很小,我们考虑从此入手。假设现在只有 01 两种数,那么我们对一个 \(A\) 进行操作后会是什么样子?如果是先行后列,相当于我们对每一行按 0 的数量降序排序且把 0 放在每行最前面;如果是先列后行,相当于我们对每一列按 0 的数量降序排序且把 0 放在每行最前面。 一个 \(A\) 合法,肯定需要让其行和列分别构成的可重集相等,并且 \(A\) 的可重集和 \(B\) 的可重集也一定是相等的。说明我们对 \(B\) 进行一些行或列的交换能够得到 \(A\)。我们刻画一下这个东西,相当于如果一个 \(A\) 合法,当且仅当存在两个排列 \(p,q\),满足 \(\forall i,j,A_{i,j}=B_{p_i,q_j}\)。这个东西的数量就是两个可重集的排列数相乘:
现在考虑拓展。对于值域 \([0,9]\) 的时候我们还是先思考如何判断合法。注意到值域很小,于是我们考虑枚举值域,设当前枚举到 \(i\),那么我们将所有小于等于 \(i\) 的看成 0,否则看成 1,然后去判断 01 矩阵是否合法。如果每个 \(i\) 都合法那么这个矩阵合法。我们还是考虑刻画这个条件,相当于是存在一组排列 \((p_0,q_0,p_1,q_1,\dots,p_9,q_9)\),满足 \([A_{i,j}\le k]=\forall i,j,k,[B_{p_{k,i},q_{k,j}}\le k]\)。这个条件必要性显然,考虑充分性。就是说我们在考虑枚举值域 \(i\) 的时候,相当于在前面枚举 \(i-1\) 的基础上将变化的位置填上 \(i\)。这样填肯定是能对应一个合法的 \(A\) 的。于是现在我们就去考虑满足条件的排列组数,然后去掉重复的方案数。
直接做是困难的,我们考虑将每个条件独立。现在有 \(B_{p_{k,i},q_{k,j}}\le k\rightarrow B_{p_{k+1,i},q_{k+1,j}}\le k+1\),为了让每个枚举的 \(k\) 独立出来,我们考虑去计数更好做的。本来我们每次的排列 \((p_k,q_k)\) 是在 \((p_{k-1},q_{k-1})\) 的基础上得到的,现在我们考虑定义一个 \(p'_k={p_k\over p_{k-1}}\),然后拿 \(p'_k\) 去限制,这样就把每个 \(k\) 独立出来了。现在的条件就变成了 \(B_{i,j}\le k\rightarrow B_{p'_{k,i},q'_{k,j}}\le k+1\)。
注意到 \(B\) 中 \(\le k\) 的部分是杨表,所以一个位置小于一个数的条件可以简化。设 \(a_i\) 表示 \(B\) 的第 \(i\) 行最后一个 \(\le k\) 的位置,\(b_j\) 表示第 \(j\) 列最后一个 \(\le k\) 的位置。现在我们就能将前面的条件继续转化:\(\forall j\le a_i,p'_i\le b_{q'_j}\)。考虑到 \(b\) 递减,所以当 \(q'_j\) 取最大值时限制最严,然后限制就变成了 \(p'_i\le b_{\max\limits_{j=1}^{a_i}q'_j}\)。我们令下面那一坨等于 \(c_i\),如果我们知道了 \(c_i\) 就能对 \(p',q'\) 计数。
考虑 \(p'\)。因为 \(a_i\) 递减,所以 \(c_i\) 递减,\(b_{c_i}\) 递增。于是 \(p'\) 的个数就是 \(\prod\limits_{i=1}^nb_{c_i}-i+1\)。考虑 \(q'\)。如果有 \(c_i=c_{i-1}\) 说明 \((a_{i},a_{i-1}]\) 中没有最大值,考虑区间内选第一个数答案是 \(c_i-1-(a_i-1)=c_i-a_i\),后面依次少一。如果里面有最大值,考虑每个位置出现最大值是等价的,于是多乘一个 \(a_{i-1}-a_i\) 即可,因为剩下的就等价于没有最大值的填法。
对于这个东西我们就可以考虑 dp 了,设 \(f_{i,j}\) 表示前 \(i\) 个数,\(c_i=j\) 的方案数。转移就按照上面说的做即可,注意转移的贡献与 \(j\) 无关,于是考虑后缀和优化一下即可。时间复杂度 \(\mathcal O(nmV)\)。