luogu#P8378. [PFOI Round1] Two Sequences
[PFOI Round1] Two Sequences
题目背景
syzf2222 喜欢并查集!特别是路径压缩的并查集。
题目描述
inline int find(int x){
if(x==fa[x])return x;
return fa[x]=find(fa[x]);
}
inline void merge(int x,int y){
fx=find(x),fy=find(y);
if(fx==fy)return;fa[fx]=fy;
}
这是他惯用的并查集代码,初始时对于每个 有 fa[x]=x
。
接下来的 天中,每天小 h 都给了他一个 ,表示并查集的大小(每天的 可能是不同的)。
调皮的小 x 见他不在机房,每天都在并查集上不断 merge
。
注意到小 x 不喜欢 ==
,他觉得这特别像他的眼睛,于是他不会使 merge
函数在第二行的条件语句中被 return
,否则他会十分气愤。
现在的已知信息就只有最终的 数组了。
而 syzf2222 希望还原小 x 的操作序列(即若干次按顺序进行的 merge
操作)。由于他名字里有很多个 2 而且本人也非常 2 ,他希望知道对于每一天,有多少个 数组恰好能被还原成两种操作序列,答案对 取余数。
两个操作序列不同,当且仅当某次 merge
时的变量 fx,fy
至少有一个不同。
输入格式
第一行一个整数 。
后面 行,每行读入一个整数 表示小 h 给的数。
输出格式
行,每行一个整数表示答案对 取余数的结果。
4
3
20
8492
114514
3
61560
822256526
988192964
提示
【样例解释】
对于第一天,,共有 这三种 数组使得恰有两种操作序列。
以 为例,两种操作序列分别为 merge(2,1),merge(3,1)
和 merge(3,1),merge(2,1)
,其他 merge
参数不同的方案与上述两种的其中一种是本质相同的(每次的 fx,fy
都一样)。
【数据范围】
「本题采用捆绑测试」
- ;
- ;
- 无特殊限制。
对于 的数据,满足 。