美文网首页
有9个因数的数

有9个因数的数

作者: loick | 来源:发表于2019-11-26 13:03 被阅读0次
Description

Find the count of numbers less than N having exactly 9 divisors

1<=T<=1000,1<=N<=10^12

思路

两条规则:

  1. 有奇数个数因数的数,一定是一个平方数
  2. 每个正整数都可以拆解为素数相乘的形式

有9个因数的数N,因数个数是奇数,说明它是一个数x的平方,N = x*x

假设x有4个因数,除了1和本身外,x = p1 * p2, 这里p1和p2都是素数,那么N就可以表示为N = p1*p1*p2*p2

现在来数N的因数:

1

p1

p2

p1*p1

p2*p2

p1*p2

p1*p1*p2

p1*p2*p2

p1*p1*p2*p1

一共是9个因数。

所以我们只要找出有4个因数的x,它的数量就等于有9个因数数字的数量。

怎么找x呢?

  1. 首先bound = pow(N, 0.5), 求出小于等于bound的所有素数,两个素数相乘如果小于bound,我们就找到了一个x。

  2. 需要注意的是,对于x = p1*p2, 我们假设 p1 != p1, 对于p1 == p2需要额外统计,这种情况的数量等于遍历所有上一步求出的素数,找出满足平方小于bound的素数个数。

具体步骤:

  1. 求出小于根号N bound的所有素数放在数列primes中,顺序排列,长度为L
  2. 设置两个指针,lo = 0, hi = L-1, 对于每一个hi,检查primes[lo]*primes[hi] 和bound的大小关系
  3. 如果小于bound,lo += 1, 继续2
  4. 如果大于bound,hi -= 1, 结果加上 lo (因为对于当前primes[hi], 有lo个数字与它相乘小于bound), 继续2
  5. 最后lo >= hi 退出2, 结果加上lo(lo+1)//2,因为到这里primes[lo]...primes[0]两两相乘都小于bound。
  6. 二叉搜索平方刚好大于bound的素数坐标index,结果加上index。

时间复杂度(O(k)),k是小于根号N的素数个数。

参考实现
n = 10 ** 6 // 2
isPrimes = [False] * 2 + [True] * (n - 1)
for p in range(2, n):
    if not isPrimes[p]: continue
    for i in range(p * 2, n, p):
        isPrimes[i] = False
primes = [i for i in range(n) if isPrimes[i]]

import bisect
def solve(N):
    index = bisect.bisect_left(primes, int(N ** 0.5))
    lo, hi = 0, index
    ans = 0
    while lo < hi:
        while lo < hi and (primes[lo] * primes[hi]) ** 2 <= N:
            lo += 1
        if lo == hi: break
        ans += lo
        hi -= 1
    ans += lo * (lo + 1) // 2
    import math
    ans += bisect.bisect_right(primes, int(math.pow(N, 1 / 8)))
    return ans

相关文章

  • 有9个因数的数

    Description Find the count of numbers less than N having ...

  • 我计算 我快乐一一关于简便运算的几种形式

    1.如果一个算式里有四个数,并且是两个因数相乘,减,另两个因数相乘,其中有一个因数是相同的,那么就用这个相同的因数...

  • IGCSE数学考前复习纲要

    IGCSE数学复习大纲 1、数 1.1理解自然数、整数 (正,负,零)、质数,平方数和立方数,公因数还有公倍数,有...

  • 求最大公约数

    基本概念 因数 :若A=m×n,则称m,n是A的因数;A是m,n的倍数 一个数的最大因数和最小倍数都...

  • 奥数题-因数

    题目:育才少儿班二轮试读共380人,试读前一天分成10个班分别进行各种活动让大家彼此熟悉,每个班30~50人。已知...

  • 整数乘法(小学数学笔记)学习资料分享

    1.乘法:求几个相同加数的和的简便运算。 2.相乘的数叫因数,乘得的数叫做积 3.乘法各部分间的关系: 积=因数×...

  • 如果我不会……

    昨天我批改孩子们回家作业,有一题要求一个数的最大公因数,有六七个孩子将两个数先分解质因数,然后再得出最大公...

  • 《分解质因数》教学反思

    分解质因数是在因数和倍数以及能被2、5、3整除的数的特征的基础上进行教学的。分解质因数是求最大公约数、最小公...

  • 100以内的质数.

    这几天,我在学校里学了质数和合数。质数是指只有1和它本身两个因数的数。合数是指至少有三个因数(包括三个)的数。 现...

  • 速算里面的提取公因数(小学五年级)

    其实这两道题都是对于:疑似公因数变化后的提取 对于这个问题通常只需注意两点:1是否有互补的数,2找公因数 这两道题...

网友评论

      本文标题:有9个因数的数

      本文链接:https://www.haomeiwen.com/subject/jqpewctx.html