容斥原理、欧拉函数、phi

容斥原理:

  直接摘用百度词条

    

也可表示为
设S为有限集,
,则
两个集合的容斥关系公式:A∪B = A+B - A∩B (∩:重合的部分)
三个集合的容斥关系公式:A∪B∪C = A+B+C - A∩B - B∩C - C∩A +A∩B∩C
详细推理如下:
1、 等式右边改造 = {[(A+B - A∩B)+C - B∩C] - C∩A }+ A∩B∩C
2、文氏图分块标记如右图图:1245构成A,2356构成B,4567构成C
3、等式右边()里指的是下图的1+2+3+4+5+6六部分:
那么A∪B∪C还缺部分7。
4、等式右边[]号里+C(4+5+6+7)后,相当于A∪B∪C多加了4+5+6三部分,
减去B∩C(即5+6两部分)后,还多加了部分4。
5、等式右边{}里减去C∩A (即4+5两部分)后,A∪B∪C又多减了部分5,
则加上A∩B∩C(即5)刚好是A∪B∪C。
 

欧拉函数

定义

欧拉函数PHI(n)表示的是比n小,并且与n互质的正整数的个数(包括1)。
比如:PHI(1) = 1; PHI(2) = 1; PHI(3) = 2; PHI(4) = 2; ... PHI(9) = 6; ...

通式及其证明

要计算一个正整数n的欧拉函数的方法如下:
1. 将n表示成素数的乘积: n = p1 ^ k1 * p2 ^ k2 * ... * pn ^ kn(这里p1, p2, ..., pn是素数)
2. PHI(n) = (p1 ^ k1 - p1 ^ (k1 - 1)) * (p2 ^ k2 - p2 ^ (k2 - 1)) * ... * (pn ^ kn - pn ^ (kn - 1))
               =n*(p1-1)(p2-1)……(pi-1)/(p1*p2*……pi);
                  =n*(1-1/p1)*(1-1/p2)....(1-1/pn)
 
然而在紫薯上给出了另外一种求解欧拉phi函数值的方法(方法与筛法求素数非常类似)
void phi_table (int n,int* phi){
    for (int i=2;i<=n;i++) phi[i]=0;
    phi[i]=1;
    for (int i=2;i<=n;i++) if (!phi[i]) {
        for (int j=i;j<=n;j+=i) {
            if (!phi[j]) phi[j]=j;
            phi[j]=phi[j]/i*(i-1);
        }
    }
}

然而我并没有弄懂其原理= =

原文地址:https://www.cnblogs.com/acbingo/p/4579200.html