题目
给整数M和一个长度为N的数列${a_i}$,其中$0\leq a_i\leq M−1$。
构造一个最长的数列${b_i}$,满足如下性质:
- $0\leq b_i\leq M−1$
- 前缀积模M的值各不相同
- 前缀积模M的值不在数列${a_i}$中出现
数据范围
$0\leq N\leq M\leq 200000$
做法
此题对数列${b_i}$没什么要求,对其前缀积有要求,考虑从前缀积下手,只要构造出了前缀积,原数列也能求出来。设前缀积为$p_1,p_2,\cdots,p_k$,则有$p_i−1\times b_i \equiv p_i\mod M$,而这个式子有解等价于$gcd(p_i−1,M)|p_i$。注意到,$gcd(p_i,M)=gcd(p_j,M)$时,$p_i$和$p_j$可以相邻。所以,按照$gcd(p_i,M)$的值将$p_i$分类。以$gcd(p_i,M)$的值作为顶点,以整除关系来连有向边,建一个DAG,跑最长路即可。对前缀积0特判一下。
代码
|
|
注意
extgcd
中的乘法可能会爆int