标签:
省队集训看着台上的老师讲了一上午的莫比乌斯反演,整个人都是懵的,因为我看不清黑板和投影!!!
回家后本来想晚上自学完的,却奈何自己是个拖延症患者,只敲了μ函数(说多了都是泪QAQ)
代码的思路如下:
1.算质因数个数时因为有将1算上,所以每次都需要将符号取反;
2.为什么这样做能算出μ(a)=0呢?证明如下(如果有错可以指出,但别打我QAQ):
①先证明:已知a=p1*p2*p3*...*pn*pi(1<=i<=n且p为质数)
则μ(a)=μ(1)μ(p1)+μ(p2)+...μ(n)+μ(p1p2)+μ(p1p3)+...μ(pn-1pn)(为什么不列举μ(pi^2*...)呢?因为它的值是0,不影响结果)
可以发现,上式中μ()值为1、-1的各有n个(因为μ(pi^2)=0),相抵消一下,μ(a)就等于0了。
②其次再证明:已知a=p1^b1*p2^b2*p3^b3*...*pn^bn(bi≠0且max(bi)>1)且μ(a)=0
则令a‘=p1^b1*p2^b2*p3^b3*...*pn^bn*pi(1<=i<=n)
μ(a‘)=μ(a)=0,因为它们满足μ(j)≠0的因数j是一样的,所以μ()值也是一样的。
然后就证完了。
1 #include<set> 2 #include<cmath> 3 #include<ctime> 4 #include<queue> 5 #include<stack> 6 #include<cstdio> 7 #include<vector> 8 #include<cstring> 9 #include<cstdlib> 10 #include<iostream> 11 #include<algorithm> 12 #define N 10000001 13 using namespace std; 14 int mu[N],n; 15 inline void get_mu(){ 16 for(int i=1;i<=n;i++){ 17 if(i==1) mu[i]=1; 18 else mu[i]=0-mu[i]; 19 for(int j=i<<1;j<=n;j+=i) 20 mu[j]+=mu[i]; 21 } 22 } 23 inline void init(){ 24 scanf("%d",&n); 25 get_mu(); 26 } 27 int main(){ 28 freopen("mobius.in","r",stdin); 29 freopen("mobius.out","w",stdout); 30 init(); 31 fclose(stdin); 32 fclose(stdout); 33 return 0; 34 }
标签:
原文地址:http://www.cnblogs.com/AireenYe/p/5651866.html