X的因子链

X的因子链

输入正整数 X,求 X 的大于 1 的因子组成的满足任意前一项都能整除后一项的严格递增序列的最大长度,以及满足最大长度的序列的个数。

输入格式
输入包含多组数据,每组数据占一行,包含一个正整数表示 X。

输出格式
对于每组数据,输出序列的最大长度以及满足最大长度的序列的个数。

每个结果占一行。

数据范围
1≤X≤220
输入样例:
2
3
4
10
100
输出样例:
1 1
1 1
2 1
2 2
4 6

题解
由算术基本定理得:
所有正整数都可以分解成质因子乘积的形式,

N = P [ 1 ] d [ 1 ] ∗ P [ 2 ] d [ 2 ] … P [ k ] d [ k ] N = P[1]^{d[1]} * P[2]^{d[2]} … P[k]^{d[k]} N=P[1]d[1]P[2]d[2]P[k]d[k]
然后,我们就可以使用上述组合,第一个数是一个质因子,第二个数是两个质因子,…
比如: 20 = 2 2 ∗ 5 1 20 = 2^2 * 5^1 20=2251
则将两个2和一个5:
2,22,225
2,2
5,252
5, 52,52*2
(1+2)!/(1!+2!)

N = (1 << 20) + 100
primes = []
st = [False for i in range(N)]
mprimes = [0 for i in range(N)]

def get_primes(n):
    for i in range(2, n+1):
        if st[i] == False:
            primes.append(i)
            mprimes[i] = i
        j = 0
        while i * primes[j] <= n:
            st[i * primes[j]] = True
            mprimes[i * primes[j]] = primes[j]
            if i % primes[j] == 0:
                break
            j += 1
get_primes(N - 1)
while True:
    try:
        n = int(input())
        res = []
        while n != 1:
            
            j = mprimes[n]
            # print(n, j)
            cnt = 0
            while n % j == 0:
                cnt += 1
                n //= j
            res.append(cnt)
            if n == 1:
                break
        if len(res) == 0:
            print(0,0)
        else:
            ans = 1
            j = 0
            for it in res:
                for i in range(1, it + 1):
                    j += 1
                    ans *= j
                    ans //= i
        print(j, ans)
    except:
        break
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值