整数因子分解问题
2015-11-20 07:59
246 查看
题目描述
大于1 的正整数n可以分解为:n=x1*x2*…*xm。
例如,当n=12 时,共有8 种不同的分解式:
12=12;
12=6*2;
12=4*3;
12=3*4;
12=3*2*2;
12=2*6;
12=2*3*2;
12=2*2*3。
对于给定的正整数n,编程计算n共有多少种不同的分解式。
输入
每组测试数据的第一行有1 个正整数n(n<=10^10)。
输出
将计算出的不同的分解式数输出。
样例输入
样例输出
这道题如果用搜索就需要用到记忆化搜索,用map存,然后优化至sqrt(n)就
可以求出来。
另外一种用动态规划,
12的因子有
1 2 3 4 6 12
1 1 1 2 3 8
那么就只需要分解因子就行。
大于1 的正整数n可以分解为:n=x1*x2*…*xm。
例如,当n=12 时,共有8 种不同的分解式:
12=12;
12=6*2;
12=4*3;
12=3*4;
12=3*2*2;
12=2*6;
12=2*3*2;
12=2*2*3。
对于给定的正整数n,编程计算n共有多少种不同的分解式。
输入
每组测试数据的第一行有1 个正整数n(n<=10^10)。
输出
将计算出的不同的分解式数输出。
样例输入
12
样例输出
8
这道题如果用搜索就需要用到记忆化搜索,用map存,然后优化至sqrt(n)就
可以求出来。
另外一种用动态规划,
12的因子有
1 2 3 4 6 12
1 1 1 2 3 8
那么就只需要分解因子就行。
#include <stdio.h> #include <map> using namespace std; map < int, int > vis; int dfs ( int n ) { if ( n == 1 ) return 1; if ( vis ) //搜索过 return vis ; int s = 1; for ( int i = 2; i*i <= n; i ++ ) //优化至sqrt(n) if ( n%i == 0 ) //因子 { s = s+dfs ( i ); if ( i != n/i ) //不相等就搜下一层 s = s+dfs ( n/i ); } vis = s; return s; } int main ( ) { int n; scanf ( "%d", &n ); printf ( "%d", dfs ( n ) ); return 0; }
相关文章推荐
- scala-协变、逆变、上界、下界
- ExtJS4.2学习(11)可拖放的表格(转)
- [贪心经典算法]Kruskal算法
- 利用C#开发移动跨平台Hybrid App(一):从Native端聊Hybrid的实现
- scala-协变、逆变、上界、下界
- Gearman
- 小小的模线性方程(组)
- OSChina 周五乱弹 —— 真人 007
- css中的类样式和id样式有何区别?
- Android JNI调用函数命名原则规范
- the system is running in low_graphics mode解决方法(试验成功且完整有图)
- python3.x 对 python2.x 语法变动
- ExtJS4.2学习(10)分组表格控件--GroupingGrid(转)
- Python基础(3)
- 立个FLAG 希望半年之后再看看自己的进步
- Drupal 7 中文安装教程
- sendEmail实现邮件报警
- 不当“键盘侠”
- ExtJS4.2学习(九)属性表格控件PropertyGrid(转)
- 如何用shell脚本实现自动监测mysql实例状态