@ruanxingzhi
2019-07-11T00:48:56.000000Z
字数 2721
阅读 986
化简:((a && b) || (c %% !b)) && (!a || b || c)
布尔代数:以bool值为基本研究对象。以1表示真,0表示伪。
用*
来表示逻辑与,用+
来表示逻辑或。
则有基本的运算规律:
A | B | A+B | A*B |
---|---|---|---|
0 | 0 | 0 | 0 |
0 | 1 | 1 | 0 |
1 | 0 | 1 | 0 |
1 | 1 | 1 | 1 |
另外,引入“非”运算:为的取反。
艾弗森括号: e.g. [1==2]
为0;[3|x]
在取3的倍数时为1,否则为0。
这个记号方便了我们表达一些实际问题。例如,假设我们手中有一张表,要求出互质的的对数。答案就是:
如果要求出所有数对的gcd之和,怎么搞?
后面的柿子我们已经会求了,故可以做完此题。
实际上,存在应对每次查询的办法。(数论分块)
以上练习了艾弗森括号的使用。它将在我们做数论题的时候发挥重大作用。
回来继续讨论布尔代数。首先,不难发现结合律、交换律、分配律。
有几个恒等式:,。,.
依据这些法则,我们能否化简呢?
人话:假设,那么;否则,故.
De Morgan定理
众所周知,C++支持一些位运算,下面以int型为例。每个int变量可以视为长度为32的布尔数组,& | ^
都是逐位运算。
如果要判断一个数是奇数还是偶数,怎么做?
如果要判断一个数是不是8的倍数,怎么做?
补码是什么?
如何取出一个数的二进制上的 最后一个 1?例如,10001111100
取出00000000100
今有一个长度为的数组,已知这里面:个数重复出现了两次;只有一个数仅出现一次。要求快速找到这个仅出现一次的数。
我们把一些“东西”叫做集合。
集合元素必须要是确定的、可以互相区别开的事物。
下面哪个属于集合?
A. 上海交通大学的“好几百个”教授
B. 所有跑得快的记者
C. 身高不低于1.80m的拥有美国国籍的人
空集
属于、包含于
交集、并集、补集、差集
集合论上的De Morgan定理
对称差运算
集合论不仅能描述事物,还可以描述事物之间的联系。
公理1. 人都是要死的。
公理2. 苏格拉底是人。
结论. 苏格拉底biss。
我们用集合论的语言重新描述这个推理过程。
公理1. 凡是人都得死,故“human”这一集合包含于“biss”集合。
公理2. 苏格拉底是人,故“Socrates”这一元素属于“human”集合。
结论. “Socrates”属于“biss”集合。苏格拉底biss。
刚刚我们由“凡是人都得死”,得到了。从这里我们可以导出“子集”的定义:是的子集,当且仅当
它们的等价性取决于这样一个事实:命题p与其逆否命题,正确性一致。
幂集:考虑一个新的集合:它的每个元素都是的子集。这样的集合记为.
有多少个元素?
若,那么
若,那么
抽屉原理:(又称鸽巢原理)把个苹果放进个箱子,必然存在一个箱子,里面放了至少两个苹果。
【推广】平均值原理:把个苹果放进个箱子,必然存在一个箱子,里面放了至少个苹果。
求证:任意取52个正整数,这里面必然存在,使得要么是100的倍数,要么是100的倍数。
// 求证:在中任取个数,必然有一个数是另一个数的倍数。
容斥原理
首先来研究笛卡尔积。
称的子集R为定义在A上的关系。若,则称。
例如,整除关系。,则整除关系为
一个关系R肯定可以被记录在矩阵中(称为关系矩阵)。
今有n个点,某些点之间修了路,问每个点最终能到达哪些点。(传递闭包)
几类特殊的关系:
等价关系和等价类
偏序关系可以映射到DAG上去。这就是“Hasse图”。
什么东西可以用线段树维护?
利用每个节点记录的信息,可以得知这一区间的答案;可以很方便地合并两个相邻区间的答案。
max值/sum值明显可以。
今有任务:实时查询区间最小值和最小值出现的次数。能否直接用线段树维护?
ST表:必须满足区间可加性。
映射是的一个子集,且满足:
单射、满射、双射
封闭性
结合律
单位元
逆元
则称为一个群。
(有理数,乘法):群。(无理数,乘法):不是群。
(整数,乘法):不是群。(正整数,乘法):是群。
能用树状数组维护,必然满足性质:
此时出现了减号,要求存在逆元。