1240 莫比乌斯函数

1240 莫比乌斯函数

 
莫比乌斯函数,由德国数学家和天文学家莫比乌斯提出。梅滕斯(Mertens)首先使用μ(n)(miu(n))作为莫比乌斯函数的记号。(据说,高斯(Gauss)比莫比乌斯早三十年就曾考虑过这个函数)。
 
具体定义如下:
如果一个数包含平方因子,那么miu(n) = 0。例如:miu(4), miu(12), miu(18) = 0。
如果一个数不包含平方因子,并且有k个不同的质因子,那么miu(n) = (-1)^k。例如:miu(2), miu(3), miu(30) = -1,miu(1), miu(6), miu(10) = 1。
给出一个数n, 计算miu(n)。
 

输入

输入包括一个数n,(2 <= n <= 10^9)

输出

输出miu(n)。

输入样例

5

输出样例

-1


莫比乌斯函数模板题

 1 //莫比乌斯函数 
 2 
 3 #include <bits/stdc++.h>
 4 #define N 1000005
 5 using namespace std;
 6 
 7 bool check[N];
 8 int prime[N];
 9 int mu[N];
10 
11 void moblus(){ //莫比乌斯函数  线性筛
12     mu[1] = 1;
13     int tot = 0;
14     for(int i = 2; i <= N; ++i){
15         if(!check[i]){
16             prime[tot++] = i;
17             mu[i] = -1;
18         }
19         for(int j = 0; j < tot; ++j){
20             if(i*prime[j] > N) break;
21 
22             check[i*prime[j]] = true;
23 
24             if( i%prime[j] ){
25                 mu[i*prime[j]] = -mu[i];
26             }else{
27                 mu[i*prime[j]] = 0;
28                 break;
29             }
30         }
31     }
32 }
33 
34 
35 int miu(int n){ // 单点计算
36     int ans = 0;
37     for(int i = 2; i*i <= n; ++i){
38         if(n%i)
39             continue;
40         int cnt = 0;
41         ans ++;
42         while(n%i == 0){
43             n /= i;
44             cnt ++;
45         }
46         if(cnt >= 2){
47             return 0;
48         }
49     }
50     if(n != 1)
51         ans ++;
52     return ans%2 ? -1 : 1;
53 }
54 
55 int main(){
56     int n;
57     cin>>n;
58     // moblus();
59     // for(int i = 1; i <= n; i++){
60     //     cout<<mu[i]<<" ";
61     // }
62     // cout<<endl;
63     cout<<miu(n)<<endl;
64     return 0;
65 }

 




posted @ 2018-11-10 16:46  #忘乎所以#  阅读(213)  评论(0编辑  收藏  举报