CF1371E2 Asterism (Hard Version)
题目描述
这是该问题的困难版本。不同版本的区别在于 $n$ 和 $a_i$ 的约束条件。只有在所有版本的问题都被解决后,你才能进行 hack。
首先,Aoi 想出了如下的竞赛编程题目:
Yuzu 是一个收集糖果的女孩。起初,她有 $x$ 颗糖果。还有 $n$ 个敌人,编号为 $1$ 到 $n$。第 $i$ 个敌人有 $a_i$ 颗糖果。
Yuzu 需要确定一个排列 $P$。排列是一个包含 $n$ 个 $1$ 到 $n$ 的不同整数的数组,顺序任意。例如,$\{2,3,1,5,4\}$ 是一个排列,但 $\{1,2,2\}$ 不是排列($2$ 在数组中出现了两次),$\{1,3,4\}$ 也不是排列(因为 $n=3$,但数组中有数字 $4$)。
之后,她将按照以下规则与敌人进行 $n$ 场决斗:
- 如果 Yuzu 拥有的糖果数不少于敌人 $P_i$ 的糖果数,她就赢得这场决斗,并获得 $1$ 颗糖果。否则,她输掉这场决斗,什么也得不到。
- Yuzu 在每场决斗中获得的糖果会在接下来的决斗中使用。
Yuzu 想要赢得所有决斗。请问有多少个合法的排列 $P$ 存在?
这个问题对 Aoi 的朋友 Akari 来说太简单了,不够有趣。于是 Akari 基于上述想法提出了如下问题:
我们定义 $f(x)$ 为对于整数 $x$ 的合法排列数。
现在给定 $n$、$a$ 和一个质数 $p \le n$。我们称正整数 $x$ 是“好”的,如果 $f(x)$ 不能被 $p$ 整除。请找出所有“好”的整数 $x$。
你的任务是解决 Akari 提出的这个问题。
输入格式
第一行包含两个整数 $n$ 和 $p$,$2 \le p \le n \le 10^5$。保证 $p$ 是质数(只有两个约数 $1$ 和 $p$)。
第二行包含 $n$ 个整数 $a_1, a_2, \ldots, a_n$,$1 \le a_i \le 10^9$。
输出格式
第一行输出“好”的整数 $x$ 的个数。
第二行按升序输出所有“好”的整数 $x$。
保证“好”的整数 $x$ 的数量不超过 $10^5$。
说明/提示
在第一个测试中,$p=2$。
- 如果 $x \le 2$,Yuzu 没有合法的排列。因此 $f(x)=0$,而 $0$ 能被 $2$ 整除,所以所有 $x \le 2$ 都不是“好”的。
- 如果 $x=3$,只有 $\{1,2,3\}$ 是 Yuzu 的合法排列。所以 $f(3)=1$,因此 $3$ 是“好”的。
- 如果 $x=4$,$\{1,2,3\}$、$\{1,3,2\}$、$\{2,1,3\}$、$\{2,3,1\}$ 都是 Yuzu 的合法排列。所以 $f(4)=4$,因此 $4$ 不是“好”的。
- 如果 $x \ge 5$,所有 $6$ 种排列都是合法的。所以 $f(x)=6$,因此所有 $x \ge 5$ 都不是“好”的。
所以,唯一的“好”数是 $3$。
在第三个测试中,对于所有正整数 $x$,$f(x)$ 都能被 $p=3$ 整除。
由 ChatGPT 4.1 翻译