SP131 SQDANCE - Square dance

题目描述

你被法国国家安全局(NSA)雇佣,目的是破解 Pink Card 上使用的 RSA 密码。最简单的方法是分解公钥模数,你已经找到了最快的算法,但需要解决一个子问题,该问题可以建模如下: 设 $ \mathcal{P} = \{p_1, p_2, \dots, p_n\} $ 是一组质数。 我们称一对**关系**为一对质数 $(p,q)$,其中 $ p $ 和 $ q $ 是 $ \mathcal{P} $ 中不同的元素。给定 $ R $ 个关系 $ S_i = \{p_i, q_i\} $。 依次插入关系 $S_i$,同时你需要动态维护一个集合 $C=\{S_{j_1},S_{j_2},\cdots,S_{j_k}\}$(初始时 $C$ 是空集)。现在处理 $S_i$:如果存在一个 $C$ 的子集 $D=\{S_{t_1},S_{t_2},\cdots,S_{t_r}\}$,使得 $p_{t_1}\times p_{t_2}\times \cdots\times p_{t_r}\cdots q_{t_1}\times q_{t_2}\times \cdots \times q_{t_r}$ 是一个 **完全平方数**,则增加平方数的计数,但不把 $S_i$ 加入 $C$。否则,把 $S_i$ 加入 $C$。 你需要统计过程中出现的平方数数量。

输入格式

输入的第一行包含一个数字 $ T $,表示测试用例的数量。 每个测试用例的第一行包含两个整数 $ P $ 和 $ R $: - $ P$ 是该测试用例中出现的质数的数量; - $ R$ 是到达的质数集合的数量。 随后的 $ R $ 行,每行包含两个整数 $ i $ 和 $ j $,构成一个集合 $ \\{p_i, p_j\\} $($ 1 \leq i, j \leq P $)。

输出格式

对每组数据,输出一行,表示统计过程中出现的平方数数量。 多组数据之间以换行符隔开。

说明/提示

### 样例 1 解释 首先到达 $ S_1 = \{2, 3\} $,我们把它放入 $ C $; 然后到达 $ S_2 = \{5, 11\} $、$ S_3 = \{3, 7\} $,它们也被存入 $ C} $。 现在进入关系 $ S_4 = \{2, 7\} $。这个关系可以用来形成平方:$ S_1 * S_3 * S_4 = (2\times 3) \times (3 \times 7) \times (2 \times 7) = (2 \times 3\times 7)^2 $ 所以我们计数,并且不将 $ S_4 $ 存入 $ C $。 现在我们考虑 $ S_5 = \{5, 11\} $,它可以与 $ S_2 $ 形成一个平方,所以再计数。 然后 $ S_6 = \{2, 13\} $ 被放入 $ C$。 现在 $ S_7 = \{7, 13\} $,发现$ S_1 * S_3 * S_6 * S_7 $ 可以形成平方,于是计数。 最终,我们得到 $3$ 个平方。 ### 数据范围 对于所有数据,$1\le T\le 30$,$1\le P,R\le 10^5$。