【小算法】求约数个数
来源:互联网 发布:音频制作软件手机软件 编辑:程序博客网 时间:2024/06/14 00:43
约数个数及证明
从小学数学开始?
什么是约数:如果一个整数能被两个整数整除,那么这两个数是这个数的约数。
一个数的约数的个数=这个数的所有质因子的次数+1的乘积。
例如:48=2^4*3
48的约数的个数=(4+1)*(1+1)=10
证明:(来自权限chairman)
2^0*3^0
2^0*3^1
2^0*3^2
……
2^1*3^0
2^1*3^1
……
2^2*3^0
……
2^x*3^0
……
2^x*3^y
举个栗子:
6
2^0 3^0
2^0 3^1
2^1 3^0
2^1 3^1
——>4
10(2^1*5^1)
2^0 5^0
2^0 5^1
2^1 5^0
2^1 5^1
——>4
12(2^2*3^1)
2^0 3^0
2^0 3^1
2^1 3^0
2^1 3^1
2^2 3^0
2^2 3^1
——>6
根据乘法原理 2一共有x+1个幂 3有y+1个幂 所以就是(x+1)*(y+1)个因子
根据唯一分解定理可知,每个大于1的数一定可以以唯一的方式被分解为若干个素数的乘积。
通过计算发现一个2000000000以内的数字不会有超过12个素因子,数据范围更大的话可以再乘。
计算某个数的约数个数时,先打表预处理出从2开始的12个素数,然后一直除。
以下代码只体现性质,实际处理质因子次数时好像可以用筛法快速解决。
#include<iostream>#include<cstdio>using namespace std;const int maxn=101;struct node{ int a,k;}s[maxn];int n,ans=1;int main(){ scanf("%d",&n); s[1].a=2,s[2].a=3,s[3].a=5,s[4].a=7,s[5].a=11,s[6].a=13,s[7].a=17,s[8].a=19,s[9].a=23,s[10].a=29,s[11].a=31,s[12].a=37; int x=n; for(int i=1;i<=x;i++) { while(x%s[i].a==0) { s[i].k++; x/=s[i].a; } } for(int i=1;i<=n;i++) { ans*=s[i].k+1; } cout<<ans<<'\n'; return 0;}
阅读全文
0 0
- 【小算法】求约数个数
- 求约数个数问题
- 求约数的个数
- 求约数的个数
- 求约数的个数
- 算法提高 约数个数
- 算法提高 约数个数
- 算法提高 约数个数
- 算法提高 约数个数
- 算法提高 约数个数
- 求约数个数最多问题
- 高效率求约数的个数
- 【HUSTOJ】1034: 求约数个数
- 蓝桥杯 算法提高 约数个数
- 求N的阶乘约数的个数
- 工大OJ 1014 求约数个数
- 求一个数的约数个数!
- SOJ-1748(求约数个数)
- mybatis如何防止sql注入
- storm中的ack-fail机制
- Android 简单讯飞语音合成与语音听写
- 二、机器学习理论起点 ,模型及关键定理
- js第二天
- 【小算法】求约数个数
- Redis及其监控工具简介
- 浅谈c语言指针精华(有不规范之处)
- 遗传算法 01背包问题 C++
- codewar代码练习1——8级晋升7级
- 排序+乱搞——数字查找
- 关于jquery对象与dom对象转换
- gogland出现could not launch process: exec: "lldb-server": executable file not found in $PATH错误
- JSTL标签库的基本教程之核心标签库