51Nod - 1240 莫比乌斯函数
Posted 西北会法语
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了51Nod - 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)。
Input输入包括一个数n,(2 <= n <= 10^9)Output输出miu(n)。Sample Input
5
Sample Output
-1
1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 #include<cstring> 5 #include<algorithm> 6 7 using namespace std; 8 9 int isprime[100005]; 10 int prime[100005]; 11 12 void Eular(int n) 13 { 14 int cnt=0; 15 memset(isprime,1,sizeof(isprime)); 16 for(int i=2;i<=n;i++) 17 { 18 if(isprime[i]) 19 { 20 cnt++; 21 prime[cnt]=i; 22 } 23 for(int j=1;j<=cnt&&i*prime[j]<=n;j++) 24 { 25 isprime[i*prime[j]]=0; 26 if(i%prime[j]==0) 27 break; 28 } 29 } 30 } 31 32 int getmiu(int n) 33 { 34 if(n==1) 35 return 1; 36 int sum = 0; 37 for(int i=1; prime[i]*prime[i] <= n; i++) 38 { 39 if(n % (prime[i] * prime[i]) == 0) 40 return 0; 41 if(n % prime[i] == 0) 42 { 43 sum++; 44 n /= prime[i]; 45 } 46 } 47 if(n > 0) 48 sum++; 49 if(sum & 1) 50 { 51 return -1; 52 } 53 return 1; 54 } 55 int main() 56 { 57 int n; 58 Eular(50000); 59 while(~scanf("%d", &n)) 60 { 61 printf("%d\n", getmiu(n)); 62 } 63 64 65 return 0; 66 }
以上是关于51Nod - 1240 莫比乌斯函数的主要内容,如果未能解决你的问题,请参考以下文章