CF704C Black Widow

题目描述

娜塔莉亚·罗曼诺娃正在测试神盾局刚刚提供给她的新武器。为了确定测试结果,她需要找出某个方程的解的数量。该方程的形式如下: ![](https://cdn.luogu.com.cn/upload/vjudge_pic/CF704C/1d8b978fb9a12b135427c0c260993d6889a8fc0c.png) 其中 ![](https://cdn.luogu.com.cn/upload/vjudge_pic/CF704C/7fca95146e6c9642c62830d4709435706988c675.png) 表示逻辑“或”运算,![](https://cdn.luogu.com.cn/upload/vjudge_pic/CF704C/4298d47c0191af3c0a3103f431751061bc7e2362.png) 表示逻辑“异或”运算,$ v_{i,j} $ 是一些布尔变量或它们的取反。娜塔莉亚称方程左侧为一个 XNF 公式。每个括号内的语句被称为“子句”,$ v_{i,j} $ 被称为“文字”。 在娜塔莉亚手中的方程中,左侧实际上是一个 2-XNF-2 公式,变量为 $ x_{1},x_{2},...,x_{m} $ 及其取反。若满足以下条件,则 XNF 公式为 2-XNF-2: 1. 对于每个 $ 1\le i\le n $ ,有 $ k_{i}\le2 $ ,即每个子句至多包含两个文字。 2. 每个变量在公式中最多出现两次(无论正名还是取反)。请注意,某个变量可能以相同的形式出现两次,但它的取反未必在任何子句中出现(反之亦然)。 你将获得一个包含 $ m $ 个变量、由 $ n $ 个子句组成的公式。请参考示例以正确理解公式的具体样式。 娜塔莉亚更喜欢实战而非理论,所以她希望你帮忙计算该方程的解的数量。更明确地说,你需要计算有多少种方法给 $ x_{1},...,x_{m} $ 赋值 $ true $ 或 $ false $(总共 $ 2^{m} $ 种),能使整个等式成立。由于答案可能非常大,请输出对 $ 10^{9}+7 $ 取模后的结果。 请注意,有的变量可能在同一子句中出现两次,有的变量可能在公式中完全没有出现(但无论它被赋值为 $ true $ 还是 $ false $ 都算作一种方法)。

输入格式

输入的第一行包含两个整数 $ n $ 和 $ m $($ 1\le n,m\le 100000 $),分别表示子句数和变量数。 接下来的 $ n $ 行描述公式。第 $ i $ 行首先是整数 $ k_{i} $,表示第 $ i $ 个子句中的文字数量。接着有 $ k_{i} $ 个非零整数 $ a_{i,1},...,a_{i,k_i} $。如果 $ a_{i,j}>0 $,那么 $ v_{i,j} $ 表示 $ x_{a_{i,j}} $,否则表示 $ x_{-a_{i,j}} $ 的取反($ 1\le k_{i}\le 2 $,$ -m\le a_{i,j}\le m $,$ a_{i,j}\neq0 $)。

输出格式

输出一个整数,表示满足条件的赋值数量对 $ 1000000007 $($ 10^{9}+7 $)取模后的结果。

说明/提示

第一个样例对应的方程是: ![](https://cdn.luogu.com.cn/upload/vjudge_pic/CF704C/8a7d0715aca7a7756df4c64309d02f2f1b4790fe.png) 第二个样例对应的方程是: ![](https://cdn.luogu.com.cn/upload/vjudge_pic/CF704C/e73ae748289a1c91c6e0a8548db01f380614ddbc.png) 第三个样例对应的方程是: ![](https://cdn.luogu.com.cn/upload/vjudge_pic/CF704C/bdaba6b1526d3afbd73f7d5f247c3b948989c742.png) 由 ChatGPT 5 翻译