容斥原理、欧拉函数、phi
容斥原理:
直接摘用百度词条:
也可表示为
设S为有限集,
,则
两个集合的容斥关系公式:A∪B = A+B - A∩B (∩:重合的部分)
详细推理如下:
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; ...
1. 将n表示成素数的乘积: n = p1 ^ k1 * p2 ^ k2 * ... * pn ^ kn(这里p1, p2, ..., pn是素数)
通式及其证明
要计算一个正整数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)
=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); } } }
然而我并没有弄懂其原理= =