莫比乌斯函数(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,
参考代码(c++11):
如果一个数包含平方因子,那么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; }
相关文章推荐
- 浅析时钟向量算法
- 书评:《算法之美( Algorithms to Live By )》
- 动易2006序列号破解算法公布
- C#递归算法之分而治之策略
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- C#算法之大牛生小牛的问题高效解决方法
- C#算法函数:获取一个字符串中的最大长度的数字
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- 经典排序算法之冒泡排序(Bubble sort)代码
- Android数据加密之异或加密算法的实现方法
- c语言实现的带通配符匹配算法
- 浅析STL中的常用算法
- 算法之排列算法与组合算法详解
- C++实现一维向量旋转算法