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