问题来源:51nod https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1240
- 如果一个数包含平方因子,那么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。
思路:分解质因数,每找到一个质数,判断是否为质因数,及其对应的次数,一旦出现平方因子,输出0;如果没有出现平方因子,原数
num
除去这个质因数
i
,得到商num /= i
,继续寻找下一个质因数,如果寻找的质因数超过了
num‾‾‾‾√
,说明剩余的数
num
是一个质数,则已经找到最后一个质因数,无需继续计算。
参考代码(c++11):
#include <iostream>
#include <cmath>
#include <list>
using namespace std;
int main()
{
int num;
cin>>num;
int cnt = 0, i = 1;
list<int> prime; // 质数list
int sqrt_num, pow;
bool flag;
while (i <= static_cast<int>(sqrt(num))){ // 如果>,说明剩余的num是质数
i++;
sqrt_num = static_cast<int>(sqrt(i));
flag = true;
// 判断i是不是质数
for (auto iter = prime.begin(); iter != prime.end() && *iter <= sqrt_num; ++iter)
{
if (i % *iter == 0){
flag = false;
break;
}
}
if (flag)
{
prime.push_back(i);
pow = 0;
while (num % i == 0){
if (pow > 0){ // 找到平方因子
cout<<0<<endl;
return 0;
}
num /= i;
pow++;
}
if (pow > 0){ // 因子数+1
cnt++;
}
if (num == 1) // 理论上应该不会触碰,可以删除这两行
break;
}
}
cnt++; // 最后一个质因数之前尚未算入
if (cnt % 2)
cout<<-1<<endl;
else
cout<<1<<endl;
return 0;
}