莫比乌斯函数,由德国数学家和天文学家莫比乌斯提出。梅滕斯(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)。
Input示例
5
Output示例
-1
#include <iostream> #include <cstdio> #include <cstring> #include <vector> using namespace std; typedef long long ll; const int maxn=100005; vector<ll>prime,ans; int vis[100005]; ll n; void get_prime() { memset(vis,0,sizeof(vis)); for(int i=2;i<maxn;i++) { if(vis[i]) continue; prime.push_back(i); for(int j=2;j*i<maxn;j++) vis[j*i]=1; } } bool solve_ans(ll n) { for(int i=2;i*i<=n;i++) if(!(n%(i*i))) return true; return false; } int solve_prime(ll n) { ans.clear(); for(ll i=0;i<prime.size() && prime[i]*prime[i]<=n;i++) { if(!(n%prime[i])) { ans.push_back(prime[i]); while(n%prime[i]) n/=prime[i]; } } return n>1?ans.size()+1:ans.size(); } int main() { scanf("%lld",&n); get_prime(); if(n==1) printf("1 "); else { if(solve_ans(n)) printf("0 "); else { if(solve_prime(n)&1) printf("-1 "); else printf("1 "); } } return 0; }