20ZR提高组十联测 Day1

stone

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

1Q1000,1n10111 \leq Q \leq 1000, 1 \leq n \leq 10^{11}

化简一下式子

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

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

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

可以猜测,如果 nmod63n \bmod 6 \ge 3,那么答案就是 nmod6n \bmod 6,写个对拍可以发现就是这样。

如果 nmod6=0n \bmod 6 = 0,那么将它拆成 n1n-111,答案为 55

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

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

palindrome

SS 中形如 aaraaa^ra 的子串个数,其中 ara^r 代表 aa 的反串。

1S2×1061 \leq |S| \leq 2 \times 10^6

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

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

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

random

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

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