码迷,mamicode.com
首页 > 其他好文 > 详细

[蒟蒻修炼计划][模板]μ函数

时间:2016-07-07 23:55:05      阅读:416      评论:0      收藏:0      [点我收藏+]

标签:

省队集训看着台上的老师讲了一上午的莫比乌斯反演,整个人都是懵的,因为我看不清黑板和投影!!!

回家后本来想晚上自学完的,却奈何自己是个拖延症患者,只敲了μ函数(说多了都是泪QAQ)

代码的思路如下:

1.算质因数个数时因为有将1算上,所以每次都需要将符号取反;

2.为什么这样做能算出μ(a)=0呢?证明如下(如果有错可以指出,但别打我QAQ):

  ①先证明:已知a=p1*p2*p3*...*pn*pi(1<=i<=np为质数)

    则μ(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≠0max(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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!