#P3784. [SDOI2017] 遗忘的集合

    ID: 2726 远端评测题 5000ms 512MiB 尝试: 0 已通过: 0 难度: 7 上传者: 标签>2017各省省选山东O2优化莫比乌斯反演生成函数快速傅里叶变换 FFT快速数论变换 NTT

[SDOI2017] 遗忘的集合

题目描述

小 Q 在他的个人主页上放出了一个悬赏:征集只含正整数的非空集合 SS,其中的每个元素都不超过 nn,并且满足一些附加条件。

众所周知,我们可以很轻松地对于任意不超过 nn 的正整数 xx,计算出把 xx 表示成 SS 中元素之和的方案数 f(x)f(x),在这里我们约定,在任意方案中每个数字可以出现多次,但是不考虑数字出现的顺序。

例如,当 S={1,2,3,4,5}S=\{1,2,3,4,5\} 时,我们可以计算出 f(2)=2,f(3)=3,f(4)=5,f(5)=7f(2) = 2, f(3) = 3, f(4) = 5, f(5) = 7

再例如,当 S={1,2,5}S=\{1,2,5\} 时,我们可以计算出 f(4)=3,f(5)=4,f(6)=5,f(7)=6f(4) = 3, f(5) = 4, f(6) = 5, f(7) = 6

麻烦地是现在小 Q 忘记了 SS 里有哪些元素,幸运地是他用存储设备记录下了所有 f(i)modpf(i)\bmod p 的值,小 Q 希望你能利用这些信息帮他恢复出 SS 原来的样子。

具体来说,他希望你找到这样一个正整数的非空集合 SS,其中的每个元素都不超过 nn,并且对于任意的 i=1,2,,ni = 1, 2,\cdots ,n,满足把 ii 表示成 SS 中元素之和的方案数在模 pp 意义下等于 f(i)f(i),其中 pp 是记录在存储设备中的一个质数。他向你保证:一定存在这样的集合SS

然而,小 Q 觉得他存储的信息并不足以恢复出唯一的 SS,也就是说,可能会存在多个这样的集合 SS,所以小 Q 希望你能给出所有解中字典序最小的解。

对于满足条件的两个不同的集合 S1S_1S2S_2,我们认为 S1S_1 的字典序比 S2S_2 的字典序小,当且仅当存在非负整数 kk,使得 S1S_1 的前 kk 小元素与 S2S_2 的前 kk 小元素完全相等,并且,要么 S1S_1 的元素个数为 kk,且 S2S_2 的元素个数至少为 (k+1)(k + 1),要么 S1S_1S2S_2 都有至少 (k+1)(k + 1) 个元素,且 S1S_1 的第 (k+1)(k + 1) 小元素比 S2S_2 的第 (k+1)(k + 1) 小元素小。

输入格式

第一行包含两个整数 nnpp,满足 pp 是质数。

第二行包含 nn 个整数 f(1),f(2),,f(n)f(1), f(2),\cdots , f(n),含义见题目描述。

保证每一行中相邻的整数由恰好一个空格隔开,并且末尾没有多余的空格。

输出格式

你需要输出两行信息来描述字典序最小的解,其中第一行包含一个整数 m (m>0)m\ (m > 0),表示 SS 的元素个数,第二行包含 mm 个正整数 s1,s2,,sms_1, s_2,\cdots ,s_m,表示将 SS 的所有元素按升序排序后得到的序列。

你需要保证输出的每一行中相邻的整数由恰好一个空格隔开,并且每一行的末尾没有多余的空格。

5 1000003
1 2 3 5 7
5
1 2 3 4 5
9 1000003
1 2 2 3 4 5 6 7 8
3
1 2 5

提示

对于 100%100\% 的数据,有 $1 \leq n < 2^{18} , 10^6 \leq p < 2^{30} , 0 \leq f(i) < p\quad (i=1,2, \cdots , n)$。