前言

A
令 bib_ibi 表示,有多少个 j(j≤i)j(j \le i)j(j≤i) 不后于 iii 被删除。
那么答案为 NO 当且仅当: 对于每个合法的 bbb,均存在一个 i∈[1,n]i \in [1,n]i∈[1,n] 使得 (bi+1)∣ai(b_i+1)|a_i(bi+1)∣ai。
不难发现 bbb 与 n!n!n! 种删数方案构成了双射关系,因此整数序列 bbb 合法当且仅当 ∀i∈[1,n]\forall i \in [1,n]∀i∈[1,n] 满足 1≤bi≤i1 \le b_i \le i1≤bi≤i。更进一步的,2≤bi+1≤i+12 \le b_i+1 \le i+12≤bi+1≤i+1。
考虑尝试对每个 i∈[1,n]i \in [1,n]i∈[1,n],钦定一个在 [2,i+1][2,i+1][2,i+1] 之间的 BBB 使得 BBB 无法被 aia_iai 整除。显然,只要 aia_iai 不能被 [2,i+1][2,i+1][2,i+1] 中的所有数整除,那么就一定能找到这样的 BBB;从而,答案为 YES 当且仅当,对于每个 iii 均满足上述条件。
然而我们显然不能每次都 O(i)O(i)O(i) 地枚举在 [2,i+1][2,i+1][2,i+1] 中的数并进行判定,否则复杂度会退化为 O(n2)O(n^2)O(n2)。不过注意到,LCM(1,2,3,⋯ ,101)\text{LCM}(1,2,3,\cdots,101)LCM(1,2,3,⋯,101) 已经远远超过了 10910^9109,因此只要枚举在 [2,min(i+1,100)[2,\min(i+1,100)[2,min(i+1,100) 中的数并判断是否整除就足够了。
时间复杂度 O(100n)O(100n)O(100n),可以通过本题。
B
若 n<xn<xn<x,则条件等价于 n=ymod nn=y \mod nn=ymodn,显然无解。
若 n>yn>yn>y,则条件等价于 nmod x=yn \mod x=ynmodx=y。若 x>yx>yx>y,则令 n=x+yn=x+yn=x+y 即可得到一个答案。
现在只需考虑 x≤yx \le yx≤y 的情况。根据上述推导,nnn 必定满足 x≤n≤yx \le n \le yx≤n≤y。
那么该如何在此范围内找到某个 nnn 呢?不妨先思考一些比较容易构造的特殊情况——若 3x>y3x>y3x>y,那么只需要令 n=x+y2n=\frac {x+y} {2}n=2x+y 就满足了条件;这是因为,此时的 nmod x=n−xn \mod x=n-xnmodx=n−x 且 ymod n=y−ny \mod n=y-nymodn=y−n,当 nnn 为 x,yx,yx,y 的平均数时必然有 n−x=y−nn-x=y-nn−x=y−n。
对于一般情况该怎么办呢?那就转化为上述情况呗!考虑令 x′x'x′ 为不超过 yyy 的最大 xxx 的倍数,因为 nmod x′=nmod xn \mod x'=n \mod xnmodx′=nmodx,所以只要满足 nmod x′=ymod nn \mod x'=y \mod nnmodx′=ymodn 就满足了条件。注意到此时必然有 3x′>y3x'>y3x′>y,于是令 nnn 为 x′,yx',yx′,y 的平均数即可。
单次 O(1)O(1)O(1),本题被解决。
C
算法一
先思考 O(n3)O(n^3)O(n3) 的做法。枚举 l,r(l≤r)l,r(l \le r)l,r(l≤r)。
考虑贪心: 我们从后往前地进行决策,令看了 [k,r](l<k≤r)[k,r](l < k \le r)[k,r](l<k≤r) 后,拆分得到的数的最小值为 mmm;那么,我们需要将 ak−1a_{k-1}ak−1 拆分为若干个不超过 mmm 的数,并在此前提下让拆分得到的数的最小值最大。
注意到最多只会拆分出来两种不同的数,所以只需要确定其中较小的那一个就行了。通过简单的数学推导,不难得到较小的数是:
⌊ak−1⌈ak−1m⌉⌋\left \lfloor \frac {a_{k-1}} {\left \lceil \frac {a_{k-1}} {m} \right \rceil} \right \rfloor⌊⌈mak−1⌉ak−1⌋
从后往前扫描,维护当前的最小值,每次将答案加上拆分出来的数的数目减 111 即可。
若固定 rrr 并枚举 lll,复杂度被优化为 O(n2)O(n^2)O(n2)。但无法通过。
算法二
Lemma
令 ml,rm_{l,r}ml,r 表示,从 rrr 看到 lll 之后 mmm 的值。
引理给出,ml,l,ml,l+1,⋯ ,ml,rm_{l,l},m_{l,l+1},\cdots,m_{l,r}ml,l,ml,l+1,⋯,ml,r 中不同的数的级别为 O(al)O(\sqrt {a_l})O(al)。
Prove
观察这一坨:
⌊ak−1⌈ak−1m⌉⌋\left \lfloor \frac {a_{k-1}} {\left \lceil \frac {a_{k-1}} {m} \right \rceil} \right \rfloor⌊⌈mak−1⌉ak−1⌋
可以发现,在最劣情况下,上式取到的不同值的数目,与 ⌈ak−11⌉,⌈ak−12⌉,⌈ak−13⌉⋯\lceil \frac {a_{k-1}} {1} \rceil,\lceil \frac {a_{k-1}} {2} \rceil,\lceil \frac {a_{k-1}} {3} \rceil \cdots⌈1ak−1⌉,⌈2ak−1⌉,⌈3ak−1⌉⋯ 取到的不同值的数目相等。
而后者的级别是 O(ai)O(\sqrt {a_i})O(ai) 个,因此前者的级别也是 O(ai)O(\sqrt {a_i})O(ai)。
考虑用一个 vector 维护所有可能被取到的 fl,⋅f_{l,\large{\cdot}}fl,⋅ 以及对应的 rrr,那么每次就可以 O(ai)O(\sqrt {a_i})O(ai) 地计算了。
不妨设 aia_iai 与 nnn 同级,则总复杂度 O(nn)O(n \sqrt n)O(nn),本题被解决。
D
这可能是我入坑以来见到过的最好的题吧。果然还是我粗陋寡闻了。
算法一
考虑 dp\text{dp}dp。
令 fi,jf_{i,j}fi,j 表示,目前填了 iii 位,最后一位填了 jjj。
令 gl,rg_{l,r}gl,r 表示,有多少对 l≤i≤j≤rl \le i \le j \le rl≤i≤j≤r 满足 gcd(i,j)≥l\gcd(i,j) \ge lgcd(i,j)≥l。
fff 的转移如下:
fi,j=mink=1j−1{fi−1,k+gk+1,j}f_{i,j}=\min_{k=1}^{j-1} \{f_{i-1,k}+g_{k+1,j}\}fi,j=k=1minj−1{fi−1,k+gk+1,j}
现在关键在于如何求出 ggg。
考虑枚举 i,j(i≤j)i,j(i \le j)i,j(i≤j) 并计算出其贡献。首先,我们求出 gcd(i,j)=x\gcd(i,j)=xgcd(i,j)=x,则对于任意满足 l≤xl \le xl≤x 且 r≥jr \ge jr≥j 的 gl,rg_{l,r}gl,r 都要增大 111。不难发现这可以通过二维前缀和搞定。
总复杂度 O(n2k+q)O(n^2k+q)O(n2k+q),完全无法接受。
算法二
为方便叙述,我们钦定 gl,rg_{l,r}gl,r 为满足 l≤i<j≤rl \le i<j \le rl≤i<j≤r(注意是小于而不是小于等于)且 gcd(i,j)≥l\gcd(i,j) \ge lgcd(i,j)≥l 的 (i,j)(i,j)(i,j) 对数。
如果打出 ggg,你会惊人地发现: 对于任意满足 r<2lr<2lr<2l 的 (l,r)(l,r)(l,r),均有 gl,r=0g_{l,r}=0gl,r=0。
因此,若 k>log2nk>\log_2 nk>log2n,则答案为 000。
从而,fff 的第二维只需要枚举到 logn\log_nlogn 就足够啦!
总复杂度 O(n2logn)O(n^2 \log n)O(n2logn),依然无法通过。
算法三
当 nnn 达到了 3×1053 \times 10^53×105 级别后,预处理出所有的 ggg 明显已无法接受了。所以,我们不得不在转移的过程中,快速求出 ggg 值。
为方便,令 gl,r′=∑i=lr∑j=lr[gcd(i,j)≥l]g'_{l,r}=\sum_{i=l}^r \sum_{j=l}^r [\gcd(i,j) \ge l]gl,r′=∑i=lr∑j=lr[gcd(i,j)≥l],则显然有 gl,r=g′(l,r)+(r−l+1)2g_{l,r}=\frac {g'(l,r)+(r-l+1)} {2}gl,r=2g′(l,r)+(r−l+1)。
考虑使对 g′g'g′ 进行推导:
gl,r′=∑i=1r∑j=1r[gcd(i,j)≥l]=∑k=lr∑i=1r∑j=1r[gcd(i,j)=k]=∑k=lr∑i=1⌊rk⌋∑j=1⌊rk⌋[gcd(i,j)=1]=∑k=lrw⌊rk⌋\begin{aligned} g'_{l,r} &=\sum_{i=1}^r \sum_{j=1}^r [\gcd(i,j) \ge l] \\ &= \sum_{k=l}^r \sum_{i=1}^r \sum_{j=1}^r [\gcd(i,j)=k] \\ &= \sum_{k=l}^r \sum_{i=1}^{\lfloor \frac r k \rfloor} \sum_{j=1}^{\lfloor \frac {r} {k} \rfloor} [\gcd(i,j)=1] \\ &=\sum_{k=l}^r w_{\lfloor \frac r k \rfloor} \end{aligned}gl,r′=i=1∑rj=1∑r[gcd(i,j)≥l]=k=l∑ri=1∑rj=1∑r[gcd(i,j)=k]=k=l∑ri=1∑⌊kr⌋j=1∑⌊kr⌋[gcd(i,j)=1]=k=l∑rw⌊kr⌋
其中:
wx=∑i=1x∑j=1x[gcd(i,j)=1]=∑i=1xφ(x)=wx−1+φ(x)\begin{aligned} w_x &= \sum_{i=1}^x \sum_{j=1}^x [\gcd(i,j)=1] \\ &= \sum_{i=1}^x \varphi(x) \\ &=w_{x-1}+\varphi(x) \end{aligned}wx=i=1∑xj=1∑x[gcd(i,j)=1]=i=1∑xφ(x)=wx−1+φ(x)
通过线性筛+递归 O(n)O(n)O(n) 预处理出 www,那么每次就可以整除分快 O(n)O(\sqrt n)O(n) 地计算 ggg 了。
总复杂度 O(n2lognn)O(n^2 \log n \sqrt n)O(n2lognn),虽然劣于算法二,但是其潜力十足。
算法四
Lemma
fff 具有决策单调性。
采用分治优化决策单调性 dp\text{dp}dp,总复杂度 O(nlog2nn)O(n \log^2 n \sqrt n)O(nlog2nn),其依旧需要优化。
算法五
现在,关键在于把 n\sqrt nn 从复杂度从去掉。
在分治过程中,令当前想要求出 f⋅,rf_{{\large{\cdot}},r}f⋅,r 的值。我们可以从大到小枚举 lll,并实时维护 ∑k=lrw⌊rk⌋\sum_{k=l}^r w_{\lfloor \frac r k \rfloor}∑k=lrw⌊kr⌋,每次 O(1)O(1)O(1) 更新即可。
但是,如果你仔细思考,发现事情并没有这么简单: 若当前的分治区间为 [l,r][l,r][l,r] 且中点为 midmidmid,决策区间为 [L,R][L,R][L,R],若 R<midR<midR<mid 那么需要计算 ∑i=R+1midw⌊midi⌋\sum_{i=R+1}^{mid} w_{\lfloor \frac {mid} i \rfloor}∑i=R+1midw⌊imid⌋,否则无法保证后续的正确性。一种非常 naive 的想法是,直接从 min(mid,R)\min(mid,R)min(mid,R) 开始往下枚举维护,虽然拥有正确性,但是在特殊构造的数据下会退化成 O(n2log2n)O(n^2 \log^2 n)O(n2log2n)。因此,我们须套用算法四中的整除分块来计算这一部分,虽然单次 O(n)O(\sqrt n)O(n),但一共只会计算 O(nlogn)O(n \log n)O(nlogn) 次,所以不是很 shameful。
总复杂度 O(nlog2n+nnlogn)O(n \log^2 n+n \sqrt n \log n)O(nlog2n+nnlogn),看起来还不是很能接受的亚子。但题解中说它是 O(nlog2n+nn)O(n \log^2 n+n \sqrt n)O(nlog2n+nn) 的,不过我也不太会证,反正能过就是了,因此就搁这不管了。
E,F
咕咕咕

本文探讨了五个算法难题的高效解决方案,包括双射关系下的整数序列判定、整除条件的特殊构造、数列拆分问题的优化策略、复杂度优化的动态规划和大数据范围内的快速计算。每个部分都展示了从复杂到优化的过程和关键技巧。
2039

被折叠的 条评论
为什么被折叠?



