0204 广义汉明数
* * * *
拉格朗日计划
* * * *
广义汉明数

若一个正整数的所有质因数均不超过5,则称其为汉明数。

前几个汉明数分别是1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 15。

不超过$10^8$的正整数中一共有1105个汉明数。

若一个正整数的所有质因数均不超过n,就称其为n型广义汉明数。

因而此定义下的5型广义汉明数就是原来所定义的(一般意义的)汉明数。

不超过$10^9$的正整数中共有多少个100型广义汉明数?

本题难度:



解答

简单的深度优先搜索问题,此处用递归的方式实现。

用两个变量s,k分别记录目前已得的数,和当前应处理第k个素数$p_k$(k从0开始计数,即$p_0=2, p_1=3,\ldots$以此类推)。

令a从0开始依次递增,只要$s_a=sp_k^a < 10^9$,就递归处理$s_a$和$k+1$。

初值取$s=1,k=0$,小于100的素数共有25个,因此$k=25$时递归终止并检查所得的数是否超过$10^9$,最后汇总所有符合要求的终止状态即得结果$2944730$。

bound=10**9
p=[2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97]

def check(s,k):
    if k==25:
        return s<=bound
    else:
        r,t=0,s
        while t<=bound:
            r+=check(t,k+1)
            t*=p[k]
        return r

print check(1,0)