20ZR提高组十联测 Day1

stone

n n n 分成尽可能少的 3 k 2 − 3 k + 1 ( k ≥ 1 ) 3k^2-3k+1 \quad(k \ge 1) 3k23k+1(k1) 的形式。

1 ≤ Q ≤ 1000 , 1 ≤ n ≤ 1 0 11 1 \leq Q \leq 1000, 1 \leq n \leq 10^{11} 1Q1000,1n1011

化简一下式子

3 k 2 − 3 k + 1 = 3 k ( k − 1 ) + 1 = 6 × k ( k − 1 ) 2 + 1 3k^2 - 3k+1 = 3k(k-1)+1 \\ = 6 \times \frac{k(k-1)}{2} + 1 3k23k+1=3k(k1)+1=6×2k(k1)+1

打个 k ( k − 1 ) 2 \frac{k(k-1)}{2} 2k(k1) 的表

20ZR提高组十联测 Day1_第1张图片
找规律发现任意一个数都可以由三个形如 n ( n + 1 ) 2 \frac{n(n+1)}{2} 2n(n+1) 的数表示,当然你也可以由 ≥ 3 \ge 3 3 个这样的数表示,只需要拆出一个 1 1 1

可以猜测,如果 n   m o d   6 ≥ 3 n \bmod 6 \ge 3 nmod63,那么答案就是 n   m o d   6 n \bmod 6 nmod6,写个对拍可以发现就是这样。

如果 n   m o d   6 = 0 n \bmod 6 = 0 nmod6=0,那么将它拆成 n − 1 n-1 n1 1 1 1,答案为 5 5 5

如果 n   m o d   6 = 1 n \bmod 6 = 1 nmod6=1,如果能表示成 3 k 2 − 3 k + 1 3k^2 - 3k+1 3k23k+1 的形式,那么答案为 1 1 1。否则拆出一个 1 1 1 变成上一个情况,答案为 7 7 7

如果 n   m o d   6 = 2 n \bmod 6 = 2 nmod6=2,显然可以拆出两个 2 2 2 的,答案为 8 8 8。但是它可能表示为两个形如 3 k 2 − 3 k + 1 3k^2 - 3k+1 3k23k+1 的形式。所以预处理一下,散列表可能超时,这个可以用双指针。

palindrome

S S S 中形如 a a r a aa^ra aara 的子串个数,其中 a r a^r ar 代表 a a a 的反串。

1 ≤ ∣ S ∣ ≤ 2 × 1 0 6 1 \leq |S| \leq 2 \times 10^6 1S2×106

不能 kmp,不可能 Trie,SAM 又不属于 NOIp 考察范围,那么只有 hash 和 manacher。但 hash 能干的东西有点广泛。那么看看 manacher,也就是回文串。可以发现 a # a r # a a\#a^r\#a a#ar#a 长的挺像回文串,而且它确实有以两个 # \# # 为回文中心的回文串。

那么先马拉车一下。然后枚举第一个 # \# # 的位置,去统计第二个 # \# # 的贡献。也就是求在第一个 # \# # 的回文范围的右边,有多少个回文中心的左端点小于等于第一个 # \# # 的位置。

数据真水,到这 O ( n 2 ) O(n^2) O(n2) 暴力已经可以过了。可以发现这是一个二维偏序,数据范围有点大,直接小常数的树状数组维护水过去。

random

20ZR提高组十联测 Day1_第2张图片
乘上一个 n ! n! n! 就相当于对所有情况的答案求和。因为树的形态是随机的,它的高为 n \sqrt{n} n 的级别。那么需要一个 O ( n h ) O(nh) O(nh) 的算法。

但我只会 O ( n ! × n ) O(n! \times n) O(n!×n) 的暴力,溜了。

我们要求的是每个点最后的答案,所以不在一个点到根节点路径上的点对这个点的最终答案没有影响。

那么预处理每个点到根节点的路径,分别去计算每个点的答案。问题可以转换成给定一个序列 a a a,对于一个下标排列的每一项 k k k 进行操作 a k ∼ a n +  ⁣ ⁣ = a k a_k \sim a_n +\!\!=a_k akan+=ak,求所有全排列下 a n a_n an 的期望。

可是对于每个点求它的 a a a 数组已经 O ( n h ) O(nh) O(nh) 了,这个过程能 O ( 1 ) O(1) O(1) 吗,让我们期待一下神奇的题解吧。

因为最后只求 a n a_n an 的次数,所以对于每个 a i a_i ai,你要求它会被加到 a n a_n an 多少次。这个东西只与长度有关,能不能预处理呢。

对于每个 i i i,求出一个 f i f_i fi 表示 a 1 a_1 a1 加给了 a i a_i ai 多少次,这意味着排列的最后一位已经确定了,那么 i i i 只要处理到 h h h。对于 f i f_i fi,手算一下发现所有的排列中,排在 i i i 之前 ≤ i \leq i i j j j 都有贡献

f i = ∑ i = 1 n f j × [ j appears before i in permutation ] f_i = \sum_{i=1}^n f_j \times [\text{j appears before i in permutation}] fi=i=1nfj×[j appears before i in permutation]

追溯本源,发现 f i f_i fi 1 ∼ i 1 \sim i 1i 所有排列中,不同的上升子序列的个数,换句话说我们要去构造上序列,女少口β可。

枚举上升子序列的长度 l l l,预处理组合数求。

( i − 1 d − 1 ) × ( i d ) × ( i − d ) ! {i - 1 \choose d -1} \times {i \choose d} \times (i-d)! (d1i1)×(di)×(id)!

你可能感兴趣的:(20ZR膜你赛)