约数和素数


约数和素数

一般的约数都是和素数有关系的,在这里将两者放在一起

最基本的求约数方法

(1)试除法求约数   时间复杂度O(√ ̄n)

下来关于素数  一般采用线性筛素数来快速的初始化所有的素数,时间复杂度O(n)

 (3)约数的个数

如果约数的个数较大,那么一般考虑到约数的倍数,这样可以大大减少复杂度,

相关题目参考1291. 轻拍牛头 - AcWing题库

一般来说一个数N都能表示为:N=p1^s1*p2^s2*p3^3...

这时候该数的约数的个数sum=(s1+1)*(s2+1)*(s3+1)...

那么怎么来将一个数的指数p和系数s记录下来呢?

一般来说要暴力枚举一个数的所有约数是O(√ ̄n)

如:

如果这样时间复杂度还比较高的话

可以考虑先找到将这个数变为:N=p1^s1*p2^s2*p3^3...这种形式

然后dfs跑一下,p1的0次幂,1次幂....这样就可以求出来所有的约数了

在int  2e9范围内这样的话 大概只有1600个约数 时间复杂度是很低很低的.

相关题目参考200. Hankson的趣味题 - AcWing题库

另外,要注意  一般int 范围内 若转换为N=p1^s1*p2^s2*p3^3...这种形式

p的个数一般不超过9个 一般将数组的大小定为10即可