容斥原理
Posted linearode
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了容斥原理相关的知识,希望对你有一定的参考价值。
容斥原理
设(S_1,S_2,cdots,S_n)为有限集,(|S|)表示集合(S)的大小,则:
[
left | igcup_{i=1}^nS_i
ight |=sum_{i=1}^n|S_i|-sum_{1leq i <j leq n}|S_i cap S_j|+sum_{1leq i<j<k leq n}|S_i cap S_j cap S_k|+cdots
]
[
+(-1)^{n+1}|S_1cap cdots cap S_n| ag{1}
]
[
left | igcap_{i=1}^nS_i
ight |=sum_{i=1}^n|S_i|-sum_{1leq i <j leq n}|S_i cup S_j|+sum_{1leq i<j<k leq n}|S_i cup S_j cup S_k|+cdots
]
[
+(-1)^{n+1}|S_1cup cdots cup S_n| ag{2}
]
这个式子也可以这样写:
[
left | igcup_{i=1}^nS_i
ight |=sum_{T subseteq {1,2,cdots,n}}(-1)^{|T|+1}left | igcap_{kin T}S_k
ight | ag{3}
]
[
left | igcap_{i=1}^nS_i
ight |=sum_{T subseteq {1,2,cdots,n}}(-1)^{|T|+1}left | igcup_{kin T}S_k
ight | ag{4}
]
虽然这样的写法看起来不那么严谨,而且也没有优雅多少,但是它还是反应了问题的本质。所谓容斥原理,就是几个集合的加加减减,把多计算的减去,把多减的加回来。
回顾我们学过的欧拉函数的表达式,我们现在可以解决它了。
[varphi(n)=|{i=1,2,cdots,n mid not i}|]
注意到对于(n)的一个正因子(z>1),(1)~(n)中含有(frac{n}{z})个(z)的倍数。这(frac{n}{z})个数(x)和(n)有(gcd(n,x)=z),可以构成一个集合({x})。定义这个集合叫做(z)的(n-)限制约数集,简称(z)的约数集。
对于(gcd(x,n)=z_1z_2)的集合({x}),可以看成是原来(z_1,z_2)对应的约数集做一个交集。(z_1,z_2)的约数集的交集是(z_1z_2)的约数集,大小是(frac{n}{z_1z_2})。多个数也是同理。
([1,n])中和(n)不互质的数可以由(n)各正因子的约数集通过并集得到,由容斥原理:
[
|{i=1,cdots,n | gcd(n,i)>1}|=sum_{T subseteq {p_1,cdots,p_k},T
eq varnothing}(-1)^{|T|+1}dfrac{n}{prod_{cin T}c}
]
其中(p_i)是(n)的质因子。
由减法原理,从(1,cdots,n)中除去上面的所有数,就得到了我们想要的集合。它的大小是:
[
n-sum_{T subseteq {p_1,cdots,p_k},T
eq varnothing}(-1)^{|T|+1}dfrac{n}{prod_{cin T}c}
]
[
=(-1)^{0}dfrac{n}{1}+sum_{T subseteq {p_1,cdots,p_k},T
eq varnothing}(-1)^{|T|}dfrac{n}{prod_{cin T}c}
]
[
=nsum_{T subseteq {p_1,cdots,p_k}}prod_{c in T}(-dfrac{1}{c})
]
[
=nprod_{i=1}^{k}{(1-dfrac{1}{p_i})}
]
我们也得到了欧拉函数的表达式:
[
varphi(n)=nprod_{ ext{prime }p | n}(1-frac{1}{p}) ag{5}
]
其中从第三步推到第四步用了一个展开的公式:
[prod_{i=1}^{n}(1+b_i)=sum_{Tsubseteq {b_1,cdots,b_n}}prod_{cin T}c]
以上是关于容斥原理的主要内容,如果未能解决你的问题,请参考以下文章