题目背景
译自 Potyczki Algorytmiczne 2016 R5 CNF-SAT [B] (CNF)。1s,256M。
题目描述
我们给定 SAT 问题的定义。本题中,不区分 1 与 True,0 与 False。
SAT 问题用来求出一组逻辑变量 x1,x2,⋯,xn 的取值(其中 xi∈{True,False}),使得以下的合取范式取值为真:
(l1,1∨l1,2∨…∨l1,q1)∧(l2,1∨l2,2∨…∨l2,q2)∧…∧(lm,1∨lm,2∨…∨lm,qm)其中,(li,1∨li,2∨…∨li,qi) 称为子句(Clause),li,j 是 x1,…,xn 中的变量或其否定。我们规定一个子句中,不存在 j<k,使得 li,j 中的变量与 li,k 中的变量相同。
某人声称解决了世界难题 P=NP?。他声称,一般的 SAT 问题都可以归约到一种特例,而这种特例中的所有子句都满足特殊性质:
- ∀1≤i≤n,xi 和 ¬xi 不会同时在子句中出现。
- ∀1≤i<j<k≤n,若子句中出现了 xi(或 ¬xi)和 xk(或 ¬xk),则必然有 xj(或 ¬xj)在这个子句中出现。
这里,所有出现的变量的下标都是 1∼n。
给定满足特例的合取范式,统计有多少种不同的取值能够使其取值为真。只需要求出答案对 (109+7) 取模后的结果。
输入格式
第一行,一个正整数 n,表示变量的数量。
第二行,描述一个由若干个子句组成的合取范式:
- 两个子句之间由
^
隔开(一个空格,和 ^
,然后再是一个空格)。
- 每个子句由一对圆括号
()
包围。圆括号内部是若干变量,每个变量形如 xi
或者 ~xi
(这里,x
是英文字母 x,i
是一个正整数),其中 xi
表示 xi,~xi
表示 ¬xi。两个变量之间用 v
隔开(一个空格,和英文字母 v
,然后再是一个空格)。
这里,保证有 1≤i≤n,且子句满足题目描述中的特殊性质。
输出格式
输出答案对 (109+7) 取模后的结果。
提示
样例解释
两个合法解为 (0,1,1) 和 (1,1,1)。
数据范围
- 1≤n≤106;
- 所有子句中变量个数的和不超过 106。