#C0003. A+B 的 10 种解法

A+B 的 10 种解法

题目背景

A+B Problem 是每个 OIer 入门必做的经典题。自古以来,已有众多先辈研发出过各种解法。这次,请你以不同的解法重温这道题吧。

题目描述

我们一共有 1010 种不同的解法。分别是:

  1. 直接输出 A+BA+B
  2. 交换 AABB,再换回来,输出 A+BA+B
  3. 循环 A+BA+B 次,记录 sumsum 变量,每次 +1+1,最后输出 sumsum
  4. 二分 A+BA+B。规定 ll 初值为 109-10^9rr 初值为 10910^9,条件为 l+1<rl+1<rmid(l+r)/2mid \leftarrow (l+r)/2。若 mid=A+Bmid=A+B,直接输出,结束二分;若 mid<A+Bmid<A+B,则令 lmidl \leftarrow mid;若 mid>A+Bmid>A+B,则令 rmidr \leftarrow mid
  5. 针对第 33 点进行优化。二进制拆分 AABB(若当前数大于等于 2n2^nnn00 开始),则当前数拆分出一个 2n2^nn=n+1n=n+1;反之直接将剩下的数拆分出来),再将结果全部相加。
  6. gcd(最大公因数)。求 AABB 的 gcd,同时除以 gcd,再乘回来。
  7. 快速读入。会输入 nn 个与 A,BA,B 无关的整数,以及 AABB,全部读入后再输出 A+BA+B
  8. 线段树。将 AABB 二进制拆分为一个序列(拆分方法同上),从小到大排序,建立线段树(建立时每次将该节点维护的和分为两半,若长度为奇数则左边比右边长 11。编号由 11 开始,按从上到下,从左到右编号。注意:00 值的节点应被删除。),再查询区间 [1,n][1,n] 的和(nn 是拆分出来的数的个数)
  9. 最短路。将 AABB 二进制拆分为一个序列,从小到大排序,建无向图,图有 nn 条边,将节点编号为 11n+1n+1nn 是拆分出来的数的个数),节点 iii<n+1i<n+1)与节点 i+1i+1 有连边,边权为排序后的序列的第 ii 项。使用 floyd 算法求点 11n+1n+1 的最短路,输出。
  10. AC 自动机。构造一个由 AABB 的字符串形式拼接而成的字符串,trie 的编号由 00(根节点) 开始,按创建时间编号(依次加入 AABB 的字符串形式,从前往后加字符进 trie 树,以此从 11nn 编号,nn 是 trie 的节点数)。Fail 的意义与通常的一样。在构造出的字符串中搜寻 AABB 的字符串形式,搜到后将搜到的 AABB 相加,输出。

输入格式

先输入一个数 TT,表示使用的解法的编号。接下来:

  1. T7T\ne7,一行,两个空格隔开的整数,AABB
  2. T=7T=7,三行,第一行是一个整数 nn,第二行是 nn 个空格隔开的整数,第三行是两个空格隔开的整数,AABB

输出格式

对于 1010 种不同的解法,你需要分别输出一些中间过程。分别有:

  1. 输出一行一个整数,A+BA+B
  2. 三行,每行一个整数,分别是交换后的 AABB,换回来后的 AABBA+BA+B
  3. 输出 A+BA+B 行,每行一个整数,分别是每次循环的 sumsum
  4. 输出若干行,每行三个空格隔开的整数,分别是每次进行完一次二分的 llrrmidmid,也包括 mid=A+Bmid=A+B 时的 llrrmidmid。完整操作流程:
初始化 l,r。
循环执行直到 l+1>=r:
    计算 mid。
    若 mid=A+B:
        输出 l,r,mid。
        结束操作。
    若 mid<A+B:
        将 l 的值赋为 mid。
    否则:
        将 r 的值赋为 mid。
    输出 l,r,mid。
  1. 两行,第一行若干个空格隔开的整数,为拆分 AABB 且排序后的几个数;第二行是 A+BA+B
  2. 两行,一行一个整数,第一行为 AABB 的 gcd,第二行是 A+BA+B
  3. 输出一行,A+BA+B
  4. 输出两行,第一行 nn 个空格隔开的整数(nn 是线段树节点数),分别为每个节点维护的和;第二行是 A+BA+B
  5. 输出 n+1n+1 行(将 AABB 二进制拆分,nn 是拆分出来的数的个数),每行 n+1n+1 个整数,第 ii 行的第 jj 个数为节点 ii 至节点 jj 的最短路。
  6. 输出 44 行,第一行为一个字符串,为构造的字符串;第二行为若干个空格隔开的数字字符,分别为 trie 树中每个节点(不包括根节点 00)对应的字符;第三行分别为 trie 树中每个节点对应的 fail 指针指向的节点编号(包括根节点 00),第四行为 A+BA+B

样例

1
20 30
50

提示说明

对于每个解法,数据分别保证:

  1. 0A,B1090\le A,B\le 10^9
  2. 0A,B1090\le A,B\le 10^9
  3. 0A,B1060\le A,B\le 10^6
  4. 0A,B1080\le A,B\le 10^8
  5. 0A,B1090\le A,B\le 10^9
  6. 0A,B1090\le A,B\le 10^9
  7. 0n1070\le n\le 10^7,每个整数 0ai1090\le a_i\le 10^90A,B1090\le A,B\le 10^9
  8. 0A,B1090\le A,B\le 10^9
  9. 0A,B1090\le A,B\le 10^9
  10. 0A,B1090\le A,B\le 10^9

对于测试点 1101-10,每个点分别对应解法 1101-10。其时间、空间、赋分分别为:

  1. 5050 ms,1010 MB,11 pts
  2. 5050 ms,1010 MB,33 pts
  3. 500500 ms,1010 MB,44 pts
  4. 5050 ms,1010 MB,66 pts
  5. 5050 ms,1010 MB,66 pts
  6. 5050 ms,1010 MB,66 pts
  7. 800800 ms,1010 MB,44 pts
  8. 5050 ms,1010 MB,2020 pts
  9. 5050 ms,1010 MB,2020 pts
  10. 5050 ms,1010 MB,3030 pts