#C0003. A+B 的 10 种解法
A+B 的 10 种解法
题目背景
A+B Problem 是每个 OIer 入门必做的经典题。自古以来,已有众多先辈研发出过各种解法。这次,请你以不同的解法重温这道题吧。
题目描述
我们一共有 种不同的解法。分别是:
- 直接输出 。
- 交换 和 ,再换回来,输出 。
- 循环 次,记录 变量,每次 ,最后输出 。
- 二分 。规定 初值为 , 初值为 ,条件为 ,。若 ,直接输出,结束二分;若 ,则令 ;若 ,则令 。
- 针对第 点进行
优化。二进制拆分 和 (若当前数大于等于 ( 从 开始),则当前数拆分出一个 ,;反之直接将剩下的数拆分出来),再将结果全部相加。 - gcd(最大公因数)。求 与 的 gcd,同时除以 gcd,再乘回来。
- 快速读入。会输入 个与 无关的整数,以及 和 ,全部读入后再输出 。
- 线段树。将 与 二进制拆分为一个序列(拆分方法同上),从小到大排序,建立线段树(建立时每次将该节点维护的和分为两半,若长度为奇数则左边比右边长 。编号由 开始,按从上到下,从左到右编号。注意: 值的节点应被删除。),再查询区间 的和( 是拆分出来的数的个数)
- 最短路。将 与 二进制拆分为一个序列,从小到大排序,建无向图,图有 条边,将节点编号为 至 ( 是拆分出来的数的个数),节点 ()与节点 有连边,边权为排序后的序列的第 项。使用 floyd 算法求点 至 的最短路,输出。
- AC 自动机。构造一个由 和 的字符串形式拼接而成的字符串,trie 的编号由 (根节点) 开始,按创建时间编号(依次加入 与 的字符串形式,从前往后加字符进 trie 树,以此从 至 编号, 是 trie 的节点数)。Fail 的意义与通常的一样。在构造出的字符串中搜寻 与 的字符串形式,搜到后将搜到的 与 相加,输出。
输入格式
先输入一个数 ,表示使用的解法的编号。接下来:
- 若 ,一行,两个空格隔开的整数, 和 。
- 若 ,三行,第一行是一个整数 ,第二行是 个空格隔开的整数,第三行是两个空格隔开的整数, 和 。
输出格式
对于 种不同的解法,你需要分别输出一些中间过程。分别有:
- 输出一行一个整数,。
- 三行,每行一个整数,分别是交换后的 和 ,换回来后的 和 ,。
- 输出 行,每行一个整数,分别是每次循环的 。
- 输出若干行,每行三个空格隔开的整数,分别是每次进行完一次二分的 ,,,也包括 时的 ,,。完整操作流程:
初始化 l,r。
循环执行直到 l+1>=r:
计算 mid。
若 mid=A+B:
输出 l,r,mid。
结束操作。
若 mid<A+B:
将 l 的值赋为 mid。
否则:
将 r 的值赋为 mid。
输出 l,r,mid。
- 两行,第一行若干个空格隔开的整数,为拆分 和 且排序后的几个数;第二行是 。
- 两行,一行一个整数,第一行为 和 的 gcd,第二行是 。
- 输出一行,。
- 输出两行,第一行 个空格隔开的整数( 是线段树节点数),分别为每个节点维护的和;第二行是 。
- 输出 行(将 与 二进制拆分, 是拆分出来的数的个数),每行 个整数,第 行的第 个数为节点 至节点 的最短路。
- 输出 行,第一行为一个字符串,为构造的字符串;第二行为若干个空格隔开的数字字符,分别为 trie 树中每个节点(不包括根节点 )对应的字符;第三行分别为 trie 树中每个节点对应的 fail 指针指向的节点编号(包括根节点 ),第四行为 。
样例
1
20 30
50
提示说明
对于每个解法,数据分别保证:
- 。
- 。
- 。
- 。
- 。
- 。
- ,每个整数 ,。
- 。
- 。
- 。
对于测试点 ,每个点分别对应解法 。其时间、空间、赋分分别为:
- ms, MB, pts
- ms, MB, pts
- ms, MB, pts
- ms, MB, pts
- ms, MB, pts
- ms, MB, pts
- ms, MB, pts
- ms, MB, pts
- ms, MB, pts
- ms, MB, pts