#CCSP2021A. 最近数合并

最近数合并

时间限制: 1.0 秒

空间限制: 512 MB

题目背景

在西西艾弗岛上,生活着快乐的小 C、小 S 和小 P。最近,三位小朋友在学校里学到了“两个数之间的距离”这一重要的概念。为了巩固知识,小 P 玩起了“合并最近数”的游戏。

题目描述

A={a1,a2,...,an}A=\{a_1,a_2,...,a_n\} 是一个包含 nn 个自然数(非负整数)的集合(根据集合的定义,这 nn 个数两两不同),且其中的最大值小于一个给定的正整数 kk。

小 P 需要对集合 AA 中的数进行若干轮合并操作,到 AA 中仅剩一个数为止。每轮合并操作的流程如下:

  1. 选取数对 (x,y)(x,y):
  • 从 AA 中选取数值大小最接近的两个数 xx 和 yy,即 ∣x−y∣|x-y| 在所有数对中最小;
  • 如果有多个数对满足条件,则进一步选择其中 (x+y)(x+y) 最小的;
  • 考虑到 AA 中的数两两不同,按上述要求(即以 ∣x−y∣|x-y| 为第一关键字,(x+y)(x+y) 为第二关键字)可以选出唯一的数对 (x,y)(x,y)。
  1. 将 xx 和 yy 合并为 zz:
  • z=(x+y) mod kz=(x+y)\bmod k,即将 xx 和 yy 求和后再对 kk 取模。
  • 具体来说,首先将 xx 和 yy 从集合 AA 中删去;如果集合 AA 不包含 zz,则再将 zz 添加回集合 AA。这保证了 AA 中的自然数始终两两不同且小于 kk。

易知,小 P 的每轮合并操作会使集合 A 的规模(即包含自然数的个数)减少 11 或 22。你需要帮小 P 搞明白,在全部合并操作结束后,进行的合并操作的总轮数和 AA 中剩下的那个数。

输入格式

从标准输入读入数据。

输入的第一行包含用空格分隔的两个正整数 nn 和 kk。

输入的第二行包含 nn 个用空格分隔的自然数 a1,a2,⋯ ,ana_1,a_2,\cdots ,a_n。

输出格式

输出到标准输出。

输出共两行。

第一行输出一个整数 TT,表示总共进行了 TT 轮合并操作。

第二行输出 TT 轮合并操作后 AA 中剩下的那个数。

9 10
0 1 2 4 5 6 7 8 9
7
5

样例 1 解释

第一轮:(0,1)→1(0,1)\to 1,合并后 A={1,2,4,5,6,7,8,9}A=\{1,2,4,5,6,7,8,9\};

第二轮:(1,2)→3(1,2)\to 3,合并后 A={3,4,5,6,7,8,9}A=\{3,4,5,6,7,8,9\};

第三轮:(3,4)→7(3,4)\to 7,合并后 A={5,6,7,8,9}A=\{5,6,7,8,9\};

第四轮:(5,6)→1(5,6)\to 1,合并后 A={1,7,8,9}A=\{1,7,8,9\};

第五轮:(7,8)→5(7,8)\to 5,合并后 A={1,5,9}A=\{1,5,9\};

第六轮:(1,5)→6(1,5)\to 6,合并后 A={6,9}A=\{6,9\};

第七轮:(6,9)→5(6,9)\to 5,合并后 A={5}A=\{5\};

6 11
7 3 6 5 10 0
4
9

子任务

40%40\% 的测试数据满足 n≤200, k≤1000n\le 200,~k\le 1000;

70%70\% 的测试数据满足 n≤2000, k≤105n\le 2000,~k\le 10^5;

全部的测试数据满足 n≤105, k≤108n\le 10^5,~k\le 10^8,输入的 ai (1≤i≤n)a_i~(1\le i\le n) 两两不同且 0≤ai<k0\le a_i<k。