题目和代码请参考题目链接和代码链接,本文只记录解题思路。
首先需要解决的问题是,如何根据 v 2 + 2 g y = 0 v^2 + 2 g y = 0 v2+2gy=0,得到从 ( x 1 , y 1 ) (x_1, y_1) (x1,y1) 沿直线走到 ( x 2 , y 2 ) (x_2, y_2) (x2,y2) 的时间。
接下来需要考虑管道的有序组合。
在原排列相邻两点之间连一条线,结果折叠后,这些线会位于纸片堆的两侧,每一侧的线要么包含要么不相交。排序检查即可。
考虑将题目转化为有根无向图删边游戏 (Hackenbush),每条树边的边权代表了无向图上两端点之间的边数量。注意到对于边权大于 1 1 1 时会形成环,按奇偶性缩环即可。
在计算出 SG 值后,每一步操作会改动一条到根路径上的所有 SG 值,自根向下确定每个子树如果修改那么需要修改得到的 SG 值是多少,即可检查某一种操作是否能使得先手必胜。
考虑 x x x 和 y y y 的二进制表示 ( x k x k − 1 ⋯ x 0 ) (x_k x_{k - 1} \cdots x_0) (xkxk−1⋯x0), ( y k y k − 1 ⋯ y 0 ) (y_k y_{k - 1} \cdots y_0) (ykyk−1⋯y0),不难分析得到最小步数。
令 d p ( l e n , p , q ) dp(len, p, q) dp(len,p,q) 表示不考虑低 l e n len len 位时 x x x 是否已经小于 n n n 的状态为 p p p(若是,则 p = 1 p = 1 p=1,否则 p = 0 p = 0 p=0), x x x 和 y y y 的状态为 q q q(若 q = 0 q = 0 q=0,则高位未出现 u u u;若 q = 1 q = 1 q=1 则高位出现 u u u 但未出现 v v v;若 q = 2 q = 2 q=2,则高位已出现 u u u 和 v v v)的情况下低 l e n len len 位的 ( x , y ) (x, y) (x,y) 数量和它们对步数的贡献,枚举第 l e n len len 位转移即可,时间复杂度 O ( l e n ) O(len) O(len)。
设全集为 U U U,若 ∣ U ∣ = k |U| = k ∣U∣=k 可行,则 ∣ U ∣ = k + 1 |U| = k + 1 ∣U∣=k+1 也可行。二分 k k k,检查 ∣ U ∣ = k |U| = k ∣U∣=k 是否可行即可确定 min ∣ U ∣ \min{|U|} min∣U∣。对于可行的状态,可以归纳证明只考虑 l 1 , l 2 , ⋯ , l i l_1, l_2, \cdots, l_i l1,l2,⋯,li 不考虑 l 0 l_0 l0 时 ∣ S 0 ∪ S i ∣ |S_0 \cup S_i| ∣S0∪Si∣ 的取值是一个区间,记录上下界即可确定是否存在可行的状态。
令只考虑 l 1 , l 2 , ⋯ , l i l_1, l_2, \cdots, l_i l1,l2,⋯,li 不考虑 l 0 l_0 l0 时 ∣ S 0 ∪ S i ∣ |S_0 \cup S_i| ∣S0∪Si∣ 的上下界分别为 f ( i ) f(i) f(i) 和 g ( i ) g(i) g(i),根据 f ( i − 1 ) f(i - 1) f(i−1) 和 g ( i − 1 ) g(i - 1) g(i−1) 可以确定它们的值。
不妨设 ∣ S 0 ∪ S i − 1 ∣ = x |S_0 \cup S_{i - 1}| = x ∣S0∪Si−1∣=x,那么可以按如下方式从空集开始构造 S i S_i Si。
经过分析不难省去枚举 f ( i − 1 ) ≤ x ≤ g ( i − 1 ) f(i - 1) \leq x \leq g(i - 1) f(i−1)≤x≤g(i−1) 的过程,最后检查 ∣ U − S n − 1 ∣ |U - S_{n - 1}| ∣U−Sn−1∣ 能否不小于 l 0 l_0 l0 即可。
不妨设两个直角边对应的向量是 ( u a , u b ) (u a, u b) (ua,ub) 和 ( − v b , v a ) (-v b, v a) (−vb,va),这里 u , v , a , b u, v, a, b u,v,a,b 都是整数,且 gcd ( ∣ a ∣ , ∣ b ∣ ) = 1 \gcd(|a|, |b|) = 1 gcd(∣a∣,∣b∣)=1。若能枚举这两个向量,则可以简单计算得出对应的顶点方案数。令 a 2 + b 2 = w a^2 + b^2 = w a2+b2=w,则 s = u v w s = u v w s=uvw,可以考虑枚举出互质的 a , b a, b a,b,然后再枚举相应的 u , v u, v u,v。
不妨令 f ( w ) = 1 4 ∑ a , b ∈ Z [ a 2 + b 2 = w ] f(w) = \frac{1}{4}\sum_{a, b \in \mathbb{Z}}{[a^2 + b^2 = w]} f(w)=41∑a,b∈Z[a2+b2=w] ( w ≥ 1 ) (w \geq 1) (w≥1),则根据高斯整环上的结论可知 f ( w ) f(w) f(w) 是关于 w w w 的积性函数。具体来说,若 w = ∏ i = 1 k p i e i w = \prod_{i = 1}^{k}{p_i^{e_i}} w=∏i=1kpiei,其中 p i p_i pi 是互不相同的质因子,则 f ( w ) = ∏ i = 1 k f ( p i e i ) f(w) = \prod_{i = 1}^{k}{f(p_i^{e_i})} f(w)=∏i=1kf(piei),其中:
若令 g ( w ) = 1 4 ∑ a , b ∈ Z [ a 2 + b 2 = w ] [ gcd ( ∣ a ∣ , ∣ b ∣ ) = 1 ] g(w) = \frac{1}{4}\sum_{a, b \in \mathbb{Z}}{[a^2 + b^2 = w] [\gcd(|a|, |b|) = 1]} g(w)=41∑a,b∈Z[a2+b2=w][gcd(∣a∣,∣b∣)=1] ( w ≥ 1 ) (w \geq 1) (w≥1),则 f ( w ) = ∑ d 2 ∣ w g ( w d 2 ) f(w) = \sum_{d^2 | w}{g\left(\frac{w}{d^2}\right)} f(w)=∑d2∣wg(d2w),那么有:
于是 w w w 便有了许多限制,在题目限制内最坏的情况下, ( u , v , a , b ) (u, v, a, b) (u,v,a,b) 的数量最多为 96768,此时 s = 80753400 s = 80753400 s=80753400。
对于枚举 ( a , b ) (a, b) (a,b)。根据高斯整环能够唯一分解的结论,已知满足条件的 a 2 + b 2 = x a^2 + b^2 = x a2+b2=x, c 2 + d 2 = y c^2 + d^2 = y c2+d2=y,便可以得到满足条件的 ( a c + b d ) 2 + ( a d − b c ) 2 = x y (a c + b d)^2 + (a d - b c)^2 = x y (ac+bd)2+(ad−bc)2=xy,那么只需要对于每个质数 p p p 构造出满足 a 2 + b 2 = p a^2 + b^2 = p a2+b2=p, gcd ( ∣ a ∣ , ∣ b ∣ ) = 1 \gcd(|a|, |b|) = 1 gcd(∣a∣,∣b∣)=1 的解即可。对于有解的 p p p,不妨令 z 2 ≡ − 1 ( m o d p ) z^2 \equiv -1 \pmod{p} z2≡−1(modp),在对 z p \frac{z}{p} pz 进行连分数展开时即可找到相应的 a a a。具体来说,可以在 O ( log p ) O(\log p) O(logp) 求解出二次剩余 z z z 后,用辗转相除法求 gcd ( z , p ) \gcd(z, p) gcd(z,p),在这个过程中得到的第一个不超过 p \sqrt{p} p 的余数 r r r 可以构造一组解 a = r a = r a=r, b = p − r 2 b = \sqrt{p - r^2} b=p−r2。
注意到 ∣ a ∣ < 0 |a| < 0 ∣a∣<0 或 ∣ b ∣ < 0 |b| < 0 ∣b∣<0 或 ∣ a ∣ > ∣ b ∣ |a| > |b| ∣a∣>∣b∣ 的情况可以规约到 0 ≤ a ≤ b 0 \leq a \leq b 0≤a≤b 的情况,而 a = b a = b a=b 的情况只有 ∣ a ∣ = ∣ b ∣ = 1 |a| = |b| = 1 ∣a∣=∣b∣=1,具体实现时不妨只考虑 0 ≤ a ≤ b 0 \leq a \leq b 0≤a≤b 的情况,可以减少常数。不过这道题似乎没有极限数据。
不妨考虑连续的 w w w 和 w r w^r wr 出现的次数。
若出现次数为 1 1 1,即 w w w 两侧均无法形成 w r w^r wr,则只需要 w w w 是两个对称轴之间的子串,且这两个对称轴两边的长度都小于 ∣ w ∣ |w| ∣w∣。
若出现次数至少为 2 2 2,即 w w w 至少一侧存在相邻的 w r w^r wr,则整个串必然以 2 ∣ w ∣ 2 |w| 2∣w∣ 为周期,而 w w w 必然是一个偶回文串的左半边或右半边。
对于第一种情况,用 manacher 算出这样的对称轴,扫一遍即可。
对于第二种情况,不妨在 w w w 的右端点处统计贡献。如果 w w w 可以是一个偶回文串的左半边,那么它的长度不能超过以它右端点为对称轴的极长回文子串长度,否则它的长度必须是以这个右端点结尾的偶回文串长度的一半。前者需要枚举整个串的周期来检查,后者需要枚举整个串的周期和前缀串的回文后缀长度的公共部分。
注意到一个串的回文后缀都是这个串的最长回文后缀的 border,而一个串的 border 长度或周期长度均可以表示为 O ( log n ) O(\log n) O(logn) 个不相交的等差数列,而这样的两组等差数列求交集可以用 O ( log n ) O(\log n) O(logn) 次统计整系数方程 a x + b y = c a x + b y = c ax+by=c 满足 x l ≤ x ≤ x r x_l \leq x \leq x_r xl≤x≤xr, y l ≤ y ≤ y r y_l \leq y \leq y_r yl≤y≤yr 的整数解 ( x , y ) (x, y) (x,y) 数量的询问实现。
对于每个询问,可以 O ( log n ) O(\log n) O(logn) 得到一组特解 a x 0 + b y 0 = c a x_0 + b y_0 = c ax0+by0=c,而其他解满足 x t = x 0 + b gcd ( a , b ) t x_t = x_0 + \frac{b}{\gcd(a, b)} t xt=x0+gcd(a,b)bt, y t = y 0 + a gcd ( a , b ) t y_t = y_0 + \frac{a}{\gcd(a, b)} t yt=y0+gcd(a,b)at ( t ∈ Z ) (t \in \mathbb{Z}) (t∈Z),随便统计一下即可。这道题也似乎没有极限数据。
不难发现,如果走过的路径含有环,那么可以在这个环上走无穷次,使得之后的耗时趋近零,否则走过的路径点数不会超过 n n n。仔细思考一下可以发现,如果要走环,那么在两个加速点之间来回走不会使得解更差。
令 f ( i , j ) f(i, j) f(i,j) 表示从起点走到第 i i i 个加速点 j j j 的耗时乘以 2 i − 1 2^{i - 1} 2i−1 的最小值,枚举下一步走到哪,是否再走回来打转即可。由于 f ( i , j ) f(i, j) f(i,j) 可能达到 2 n − 1 ( n − 1 ) max w 2^{n - 1} (n - 1) \max{w} 2n−1(n−1)maxw,所以需要用 128 位整数计算。
不妨设字符串长度为 n n n,出现最多的字符 c c c 出现了 m m m 次。
若 m > n − m + 1 m > n - m + 1 m>n−m+1,则无法构造合法解。
若 m = n − m + 1 m = n - m + 1 m=n−m+1,则构造的合法解一定是 c c c 和其他字符交替出现,其他字符完全可以视为同种字符,每次选择有必要移动的相邻两个不同字符移到末尾即可。当初始串中存在 c c c 要移动,且 c c c 右侧有字符时,最后一步会需要移动唯一一个 c c c。
否则可以考虑维护还需要修改的字符串区间,每次可以从中将相邻的 01 01 01 和 12 12 12 放到末尾(将其视为删除),也可以将除了头尾的 02 02 02 之外的字符串区间移到末尾(将 02 02 02 视为删除)。这意味着可以任选两种字符将其相邻同种字符的数量减一,每次选择最大的两种字符删减即可做到最优。注意构造方案时可以尽量不动 12 12 12,需要动的 12 12 12 可以在 01 01 01 之前移动。
对于一条路径,不妨将其定向,然后考虑用路径上相邻两个点权值的大小关系组成的序列,在这个序列末尾增加两端点权值的大小关系使其构成有向环。如果这样的有向环上小于号或大于号的出现次数不超过 1 1 1,则这条路径的是满足条件的。
不妨利用点分治在 u , v u, v u,v 的最近公共祖先 p p p 处统计满足条件的路径。维护 p p p 到 u u u 或 v v v 的路径上大于号与小于号出现的次数,次数不小于 2 2 2 时可以视为次数等于 2 2 2。然后将点按照权值排序,考虑两端点的权值是否相等,对每个 u u u 统计在它之前满足条件的 v v v 即可。