1 条题解
-
0
题意简化
布尔函数 。
定义四个集合:
- :
- :
- :
- : 仿射函数(线性函数+常数)
给定表达式(包含
ZPDA^v!()\),求对应集合中的布尔函数数量,模 。。
核心思想:位掩码表示 + 容斥
1. 布尔函数的分类
对于 个变量的布尔函数,共有 个。
四个集合 及其组合可以用16种等价类表示。
2. 等价类表示
设 在四个性质上的取值:
- 是否满足 ()
- 是否满足 ()
- 是否满足 (自对偶)
- 是否满足 (仿射)
共 种组合,每种对应一个等价类。
3. 代码实现
预处理
f[]数组f[i]表示第 个等价类中的布尔函数数量。计算公式:
- 总函数数:
- 满足单个条件的函数数: 等
- 使用容斥原理计算交集大小
具体值:
f[0]:f[1],f[2]:f[3]:f[4]:f[5],f[6],f[7]:f[8]:f[9],f[10],f[12]:f[11],f[13],f[14],f[15]:
id[]数组id[0]: 集合对应的等价类掩码(哪些等价类满足 )id[1]: 集合对应的掩码id[2]: 集合对应的掩码
id[3]: 集合对应的掩码4. 表达式解析
递归解析表达式:
(...):括号内表达式!:补集,对应位掩码取反(all ^ x)Z,P,D,A:基础集合^:交集,位与(&)v:并集,位或(|)\:差集,x ^ (x & y)
5. 最终计算
解析得到结果掩码
x,表示哪些等价类在集合中。 答案 = 。数学推导
1. 布尔函数计数公式
总函数数:
单条件计数:
- ():固定一个值,
- ():同样
- (自对偶):,
- (仿射):,共 个
多条件交集:
使用容斥原理计算。
2. 模数处理
模数 是质数,可用费马小定理求逆。
注意指数要对 取模(欧拉定理)。
样例解释
,表达式
Z- 集合:
- 总函数数:
- 满足 的函数数:
输出:8
算法步骤
-
预处理:
- 计算16个等价类的函数数量
f[] - 计算四个基础集合的位掩码
id[]
- 计算16个等价类的函数数量
-
表达式解析:
- 递归解析表达式
- 用位掩码表示集合
-
计算答案:
- 根据结果掩码求和
f[i]
- 根据结果掩码求和
复杂度
- 预处理:
- 表达式解析:
- 可过
关键点
- 将集合运算转化为位运算
- 16种等价类完全分类
- 容斥计算函数数量
- 模运算处理大指数
代码特点
- 位掩码技巧
- 递归下降解析器
- 模运算优化
- 快速幂处理大指数
- 1
信息
- ID
- 6030
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- (无)
- 递交数
- 1
- 已通过
- 1
- 上传者