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=22∗51
则将两个2和一个5:
2,22,225
2,25,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