容斥原理
定理
集合SS中不具有性质Pi:1≤i≤mPi:1≤i≤m的元素个数:
AiAi为具有性质PiPi的集合
|S|−∑|Ai|+∑Ai⋂Aj−∑Ai⋂Aj⋂Ak+...+(−1)m∑A1⋂A2⋂...⋂Am|S|−∑|Ai|+∑Ai⋂Aj−∑Ai⋂Aj⋂Ak+...+(−1)m∑A1⋂A2⋂...⋂Am
项数:(m0)+(m1)+...+(mm)=2m(m0)+(m1)+...+(mm)=2m
Proof.Proof.
1.1. 没有任何一条性质的元素贡献为11
2.2. 有nn条性质的元素,在nn个集合AiAi中出现,贡献为(n0)−(n1)+(n2)+...+(−1)n(nn)=0(n0)−(n1)+(n2)+...+(−1)n(nn)=0
关于第二条的证明:
根据二项式定理,(1−1)n=0: n≠0(1−1)n=0: n≠0;
或者考虑前n−1n−1个元素都可以选或不选,最后一个元素为了保证选的元素个数的奇偶性只有一种选择,所以奇数个元素的子集数量和偶数个元素的子集数量相等
实质
也就是上面的证明过程
错排
满足ij≠jij≠j的排列数
(ni)(n−i)! = n!i!(ni)(n−i)! = n!i! 就是≥i≥i个位置不是错排的方案数,应用容斥原理即可
还有一个递推关系
Dn=nDn−1+(−1)nDn=nDn−1+(−1)n
总结
在统计一类问题时,应用容斥原理可以有效的弱化限制条件
有一种统计恰好k个的问题,限制很强,通常弱化为先拿出k个,剩下的任意
这时候容斥的形式通常是
这时候我们在统计≥j:k≤j≤n≥j:k≤j≤n时,如果依靠了枚举哪j个或者类似的DP,可能会过多的统计,比如一个k+ik+i个的方案在这时候会被考虑(k+ik)(k+ik)次,所以需要乘上一个组合数系数(k+ik)(k+ik)
有的问题是恰好没有之类的,这时候(i0)=1(i0)=1所以不用考虑这个东西;同理,恰好n个也不用考虑。
update 2017.5.3:貌似这个东西也不是这么回事儿...感觉还与二项式反演有关...还是具体问题具体分析吧
**update 2017.5.15**
今天闲来无事证明了一下,这玩意应该是普遍成立的!
我们考虑一个恰好x:x≥kx:x≥k个的方案被统计的次数:
哈哈O(∩_∩)O
莫比乌斯反演 Mobius Inversion
说明
容斥原理是莫比乌斯反演在有限偏序集上的一个实例
莫比乌斯反演应用在一类二变量函数,偏序关系到实数的映射
《组合数学》上讨论了好多任意有限偏序集的莫比乌斯反演,还有偏序集的直积,我已经看蒙了
所以直接说莫比乌斯反演在数论上的经典形式吧,反正不是整除关系也不会考
积性函数
定义
定义域为正整数集的函称为数论函数
满足f(ab)=f(a)f(b) : gcd(a,b)=1f(ab)=f(a)f(b) : gcd(a,b)=1的数论函数称为积性函数
完全积性函数对ab没有互质限制
积性函数:φ(n), μ(n)φ(n), μ(n)
完全积性函数:
-
单位函数ϵ(n)=[n=1]ϵ(n)=[n=1],
-
恒等函数id(n)=nid(n)=n
-
常函数1(n)=11(n)=1
狄利克雷卷积
满足交换律,结合律,对加法的分配律,单位元 ϵϵ
###性质 1. 积性函数的**点积**和**狄利克雷卷积**也是积性函数 2. 一个函数的约数和可以卷上11,如约数个数d(n)=(1∗1)(n)d(n)=(1∗1)(n),约数和 σ(n)=(1∗id)(n)σ(n)=(1∗id)(n)
计算
- 可以O(nlogn)O(nlogn)预处理,无脑枚举所有数的倍数
- 线性筛
- i=1, i是质数和i%p[j]!=0的情况很好求
- 对于i%p[j] == 0,可以通过分析增加一个最小质因子后的变化,或者直接考虑f(pk)f(pk)怎么求,反正积性函数不同质因子都是互质乘起来就行了不影响
- 也可以筛出最小质因子的次数,分解成f(n)=f(pk)f(npk)f(n)=f(pk)f(npk),对于f(pk)f(pk)考虑如何计算,带有约数和的可以考虑展开
- 一些非积性函数也可以通过分析函数的性质也可以用线性筛来求
例:欧拉函数可以直接根据公式得到如何处理 φ(n)=n∏pi−1pi=∏(pi−1)∗pei−1iφ(n)=n∏pi−1pi=∏(pi−1)∗piei−1
void sieve() {
varphi[1] = 1;
for(int i=2; i<=n; i++) {
if(!notp[i]) p[++p[0]] = i, varphi[i] = i-1;
for(int j=1; j<=p[0] && i*p[j]<=n; j++) {
notp[i*p[j]] = 1;
if(i%p[j] == 0) {
varphi[i*p[j]] = varphi[i] * p[j];
break;
}
varphi[i*p[j]] = varphi[i] * (p[j]-1);
}
}
for(int i=1; i<=n; i++) varphi[i] += varphi[i-1];
}
##莫比乌斯函数
\sum\limits_{d|n}\mu(d) = \sum_{i=0}{k}(-1)i\binom{k}{i}
</br>
## 欧拉函数和上面的容斥原理证明类似,应用二项式定理</br>## 欧拉函数
\varphi(n) = \sum_{i=1}^n [(n,i)=1] \
\varphi(n) = \prod p^{c-1}(p-1)
Proof.Proof. 考虑列出所有分子inin一共nn个
-
∑i=1n[(n,i)=1]∗i=[n=1]+n∗φ(n)2∑i=1n[(n,i)=1]∗i=[n=1]+n∗φ(n)2
Proof.Proof. (n,i)=(n,n−i)(n,i)=(n,n−i),除了1和2 互质成对出现,和为n
莫比乌斯反演
g=f∗1→f=g∗μg=f∗1→f=g∗μ
Proof.Proof.
两边都卷上μ∗1μ∗1
其他证明方法还有很多,我写这个是因为这个短
另一种形式
***
应用
感觉还是直接使用这个式子代换比较简单,构造函数再进行反演好像并不好想
有一些常见技巧:
- 枚举gcd取值
- 交换枚举倍数与约数
- 用莫比乌斯函数求和替换
- 改写求和指标
- 最后通常需要得到一个可以整除分块的形式,处理一个函数的前缀和后可以在根号复杂度内解决一次询问
一般的题目推导起来挺套路的,通常都是枚举两个变量求一个带着gcd的东西(有的题目需要你自己把式子变形把gcd放进去),套路推♂倒之后都变成了整除分块,然后重点就在如何通过线性筛求函数了
栗子
