#icpc2013autumnd. [icpc2013autumn_d]Everlasting -One-
[icpc2013autumn_d]Everlasting -One-
问题描述
“永恒-第一-”是今年推出的一款屡获殊荣的在线游戏。这款游戏因其众多可玩角色而迅速闻名。
在这个游戏中,一个角色由属性定义。游戏中有N个属性,从1到N编号。每个属性都有两种状态,即“光”或“黑暗”。这意味着这个游戏有2^N种不同的角色。
你可以通过职业转换来改变角色。虽然这是改变角色属性的唯一方法,但你可以随意进行多次职业转换。
职业转换规则比较复杂。如果存在两个属性a和b满足以下四个条件,就可以将角色A更改为角色B:
- 角色A的属性a的状态为“光”;
- 角色B的属性b的状态为“光”;
- 不存在属性c,使得角色A和角色B都具有属性c的“光”状态;
- 属性(a,b)是“兼容”的。
这里,当且仅当存在属性序列c_1, c_2, …, c_n满足以下三个条件时,我们说属性对(a, b)是“兼容”的:
- c_1 = a;
- c_n = b;
- 对于所有i = 1, 2, …, n-1,要么(c_i, c_{i+1}),要么(c_{i+1}, c_i)是一个特殊对。你将获得特殊对的列表。
由于你非常热爱这个游戏,你想尝试用所有的角色来玩游戏(真是疯狂)。然而,你立即意识到,根据这个游戏的职业转换规则,一个角色只能被改变为有限集的角色。我们说,如果无法通过重复职业转换将角色A变为角色B,则角色A和角色B是“本质上不同”的。
那么,接下来自然会出现以下问题:有多少个本质上不同的角色?由于输出可能非常大,你应该计算答案对1000000007取模。
输入
输入为一个数据集序列。数据集的数量不超过50个,输入的总大小小于5 MB。
每个数据集格式如下:
N M a_1 b_1 : : a_M b_M
每个数据集的第一行包含两个整数N和M(1 ≤ N ≤ 10^5,0 ≤ M ≤ 10^5)。接下来的M行中,第i行包含两个整数a_i和b_i(1 ≤ a_i < b_i ≤ N),表示第i个特殊对。输入以两个零结束。
保证如果i ≠ j,则(a_i, b_i) ≠ (a_j, b_j)。
输出
对于每个数据集,输出本质上不同的角色的数量,对1000000007取模。
样例输入
3 2
1 2
2 3
5 0
100000 0
0 0```
### 样例输出
```plain
3
32
607723520```
---
### 资源名称
[JAG Practice Contest for ACM-ICPC Asia Regional 2013](http://acm-icpc.aitea.net/index.php?2013%2FPractice%2F%CC%CF%B5%BC%C3%CF%B6%E8%CD%BD%C1%AA)