标签:
欧拉函数φ(x)表示的是1~x之间有多少个数与n互质,公式为:φ(x)=x(1-1/p1)(1-1/p2)(1-1/p3)(1-1/p4)…..(1-1/pn),其中p1, p2……pn为x的所有质因数,但是,这个东西怎么证明咧?想了两个晚上终于想出来了,网上的证明用上了中国剩余定理,虽然牛逼,但相信很多初中生会表示不理解,一下是我自己想出来的证明:
先考虑x只有一个质因数a的情况,按通式算的话是 φ(x)=x(1-1/a),这个很好理解,先构造一个集合P={1,2,3,4……x},这之中与x不互质的数必定是a的倍数,总共有x/a个,把他们删去,剩下x-x/a,把x提取出来,就是x(1-1/a)。
若x有多个质因数,那每次删去的时候就必须考虑重复删除的问题,比如当前删至pi,设M=p1Xp2Xp3X…Xpi-1,那就是要删去1~x中是pi的倍数而与M互质的数(也就是不是p1,p2,p3…pi-1的倍数的数),设为ti,因为ti是pi的倍数,所以再设ki=ti/pi,ki就变成了1~n/pi 间与M互质的数。那这些数应该有多少个呢?可以证明这些数在[1..n/pi]、[n/pi+1..2n/pi]……中是均匀分布的,那符合ki的数的个数就是当前未被删除的数的总数除以pi,设r为当前未被删除的数的个数,那经过此次删除后剩下的数的个数就是r-r/pi=r(1-1/pi),又因为r=x(1-1/p1)(1-1/p2)(1-1/p3)(1-1/p4)…..(1-1/pi-1),所以本次删除后剩余数的个数为x(1-1/p1)(1-1/p2)(1-1/p3)(1-1/p4)…..(1-1/pi),所以当把所有p1,p2,p3…pn,都进行删除后,剩下φ(x)=x(1-1/p1)(1-1/p2)(1-1/p3)(1-1/p4)…..(1-1/pn)。
然后,如何证明上一段第三行中的数是均匀分布的呢?对于一个处于1~n/pi之间的数q,分为两种情况证明:
①若q已被删除,那它在其他区间对应的某一个数(也就是在1~n之间与q对于模n/pi同余的数)
y=q+k(n/pi)(1≤k≤pi), 因为q已被删除,所以存在w≠1为q与M的最大公因数,设q=w*z1,w也必定是n/pi的因数,设n/pi=w*z2,则k(n/pi)=w*k*z2,y=w*z1+w*k*z2=w*(z1+k*z2),所以y是w的倍数,所以y已被删除。(这貌似是同余定理之一)
②若q未被删除,那它在其他区间对应的某一个数y=q+k(n/pi)(1≤k≤pi),如果y已被删除,按①中的证明方法,q也应该已被删除,不合题设,所以y也未被删除。
所以, 未被删除的数在[1..n/pi]、[n/pi+1..2n/pi]……中是均匀分布的。
得证: φ(x)=x(1-1/p1)(1-1/p2)(1-1/p3)(1-1/p4)…..(1-1/pn)。
以上证明如果有什么疏漏……233原谅我只是个SX
最后提一下鄙人在集训时看到的一道题,简单地说就是:如何编程快速求出∑gcd(i,j)(1≤j<i≤n)?其中gcd(i,j)表示i和j的最小公因数。我们可以枚举gcd后的值s,然后就是要求满足gcd(i,j)=s的i和j的个数。因为gcd(i,j)=s,所以gcd(i/s,j/s)=1,又因为i/s≥j/s,那问题就变成了求1~i/s间与i/s互质的数的个数。程序如下(当年写的):
#include<cstdio> #include<algorithm> using namespace std; int n; int p[10001],ans=0; int main(){ scanf("%d",&n); for (int i=1;i<=n;i++) p[i]=i; for (int i=2;i<=n;i++) if (p[i]==i) for (int j=i;j<=n;j+=i) p[j]=p[j]/i*(i-1); for (int i=1;i<=n;i++) for (int j=1;j<=n/i;j++) ans+=p[j]*i; for (int i=1;i<=n;i++) ans-=i; printf("%d\n",ans); }
另外,可以预处理出∑φ(i),从而减少时间复杂度。
标签:
原文地址:http://www.cnblogs.com/Enceladus/p/4979094.html