您的位置:首页 > 其它

莫比乌斯函数(51nod-1240)

2017-01-22 00:57 357 查看
问题来源: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,
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法